Почему моя форма Django не отправляет данные в базу данных?
Я новичок в Django и Python. Я создал блог для своего проекта, но при попытке использовать форму для добавления записей блога в базу данных я не могу понять, как сделать так, чтобы кнопка отправки действительно обновляла модель в базе данных. Мне удалось сделать так, чтобы она отображалась в представлении, но кнопка отправки - это проблема.
Это модель:
class BlogPost(models.Model):
title = models.CharField(max_length=250)
content = models.TextField()
post_author = models.CharField(max_length=30)
creation_date = models.DateTimeField(auto_now_add=True)
modification_date = models.DateTimeField(auto_now=True)
image = models.ImageField(upload_to='blog/files/blog_images')
categories = models.ManyToManyField('Category', related_name='posts') #Relaciona el atributo con la clase Category y permite usar category.posts
def __str__(self):
return self.title
class Meta:
verbose_name = "blog post"
verbose_name_plural = "blog posts"
Это форма:
class newPostForm(forms.Form):
title = forms.CharField(max_length=250)
content = forms.CharField(
widget=forms.Textarea()
)
image = forms.ImageField()
post_author = forms.CharField()
Вот такой вид:
def new_post(request):
if request.method == "POST":
form = newPostForm(request.POST)
if form.is_valid():
info = form.cleaned_data()
new_post_info = BlogPost(
title=info["title"],
content=info["content"],
image=info["image"],
post_author=info["post_author"],
)
new_post_info.save()
return render(request, "")
else:
form = newPostForm()
return render(request, "blog/new_post.html", {"form":form})
Не знаю, нужна ли вам еще какая-нибудь информация, дайте мне знать. Заранее спасибо!
Ваша форма содержит ImageField
, это означает, что ей нужен доступ к request.FILES
, а также:
from django.shortcuts import redirect
def new_post(request):
if request.method == 'POST':
form = newPostForm(request.POST, request.FILES)
if form.is_valid():
info = form.cleaned_data()
new_post_info = BlogPost(
title=info['title'],
content=info['content'],
image=info['image'],
post_author=info['post_author'],
)
new_post_info.save()
return redirect('name-of-some-form')
else:
form = newPostForm()
return render(request, 'blog/new_post.html', {'form': form})
и закодируйте файлы в данных формы, указав enctype=""
в HTML-форме:
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<!-- … -->
</form>
Однако я бы настоятельно рекомендовал работать с ModelForm
, который будет обрабатывать форму и сохранять ее автоматически:
class PostForm(forms.ModelForm):
class Meta:
model = BlogPost
fiels = ['title', 'content', 'image', 'post_author']
тогда мы работаем с:
from django.shortcuts import redirect
def new_post(request):
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('name-of-some-view')
else:
form = PostForm()
return render(request, 'blog/new_post.html', {'form': form})
Note: In case of a successful POST request, you should make a
redirect
[Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.
В классе newPostForm в CharField()
должно использоваться значение "max_length".Поле формы моделиld(1).