Пользовательская форма foreignkeyfield недействительна
Я создал сайт на основе постов и хочу, чтобы имя автора отображалось в посте. Это работает в админке при добавлении постов, но когда я пытаюсь загрузить пост с сайта, форма не проверяется, поэтому не сохраняется. Помогите, пожалуйста. модель :
from django.conf import settings
class MemeImg(models.Model):
Title = models.CharField(max_length=500)
op = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None, blank=True, null=True)
date_created = models.DateTimeField(auto_now_add=True)
Post_Img = CloudinaryField('Post')
формирует :
class PostImg(forms.ModelForm):
class Meta:
model = MemeImg
fields = ['Title', 'op', 'Post_Img']
просмотр :
@login_required(login_url='/login')
def post(request):
func = data(request)
if request.method == 'POST':
form = PostImg(request.POST, request.FILES, instance=request.user)
form.op = request.user
if form.is_valid():
print('success')
posts = form.save(commit=False)
posts.op = request.user
form.save()
return HttpResponseRedirect('https://youtu.be/dQw4w9WgXcQ')
else:
print("fail")
form = PostImg(request)
ctx = {
'form': form,
'url': func[0],
'name': func[1],
'date': func[2],
}
return render(request, 'Post.html', ctx)
и, наконец, шаблон страницы поста :
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="container">
{{ form.Title|materializecss }}
<div class="file-field input-field">
<div class="btn">
<span>File</span>
<input type="file">
</div>
<div class="file-path-wrapper">
{{ form.Post_Img }}
<input class="file-path validate" type="text">
</div>
</div>
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
</div>
</form>
Если требуется дополнительный код, пожалуйста, прокомментируйте его Большое спасибо
Я думаю, что ваша проблема связана с экземпляром формы, который является instance=request.user, на самом деле этот экземпляр должен быть экземпляром объекта MemeImg, а не пользователем, что заставляет его не сохранять изображение. Поэтому я удалил этот экземпляр, а также я не знаю, для чего вы используете дополнительные контекстные переменные 'url': func[0], 'name': func[1], 'date': func[2], поэтому я удалил их, чтобы все было проще. Теперь, я думаю, вы сможете сохранить файл без каких-либо проблем.
@login_required(login_url='/login')
def post(request):
if request.method == 'POST':
form = PostImg(request.POST, request.FILES)
if form.is_valid():
print('success')
data = form.save(commit=False)
data.op = request.user
form.save()
return HttpResponseRedirect('https://youtu.be/dQw4w9WgXcQ')
else:
print("fail")
form = PostImg(request.POST)
ctx = {
'form': form,
}
return render(request, 'Post.html', ctx)
Также ваша форма имела {{ form.Post_Img }}, что я не знаю, чего вы хотите добиться с помощью этих переменных, правильным способом является {{ form.as_p }} или просто вызов формы, как это {{ form }}, поэтому я сделал исправление в вашем HTML. too.
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="container">
{{ form.Title|materializecss }}
<div class="file-field input-field">
<div class="btn">
<span>File</span>
<input type="file">
</div>
<div class="file-path-wrapper">
{{ form }}
<input class="file-path validate" type="text">
</div>
</div>
<button class="btn waves-effect waves-light" type="submit" name="action">Submit
<i class="material-icons right">send</i>
</button>
</div>
</form>