Django: как сохранить данные ModelForm с ключом foregin?
Я столкнулся с проблемой при сохранении данных в базу данных! позвольте мне объяснить..... Я пытаюсь сделать приложение типа блога... & есть раздел комментариев. Есть три поля для отправки комментария: имя, email и сообщение. Но когда кто-то отправляет комментарий, он должен сохраняться в базе данных для конкретного поста блога, поэтому я определил внешний ключ в модели комментария. но он не работает! Всякий раз, когда я отправляю комментарий, он показывает ошибку NOT NULL constraint failed! Даже если я изменяю эту таблицу null=True, он не показывает никакой ошибки, но он не сохраняет никакой внешний ключ! пожалуйста, помогите мне!
models.py
from django.db import models
from ckeditor.fields import RichTextField
class Event(models.Model):
title = models.CharField(max_length=255)
description = RichTextField()
thumb = models.ImageField(upload_to="events")
amount = models.IntegerField()
location = models.CharField(max_length=255)
calender = models.DateField()
def __str__(self):
return self.title
class Comment(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
username = models.CharField(max_length=255, null=False, blank=False)
email = models.EmailField(max_length=255, null=False, blank=False)
message = models.TextField(null=False, blank=False)
date = models.DateField(auto_now_add=True)
def __str__(self):
return self.username
forms.py
from django.forms import ModelForm, TextInput, EmailInput, Textarea
from .models import Comment
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ["username", "email", "message"]
widgets = {
"username": TextInput(attrs={"placeholder":"Name *"}),
"email": EmailInput(attrs={"placeholder":"Email *"}),
"message": Textarea(attrs={"placeholder":"Message"})
}
views.py
from django.shortcuts import redirect
from django.views.decorators.http import require_http_methods
from .forms import CommentForm
@require_http_methods(["POST"])
def comment(request):
form = CommentForm(request.POST)
if form.is_valid():
form.save()
return redirect("event")
Вам нужно присвоить каждый комментарий определенному событию, поэтому в вашем views.py вы должны получить указанное событие. Для этого один из способов - передать id события через url в качестве параметра, например, в urlpattern вы можете сделать такой путь:
urlpatterns = [
# your paths
path('<int:event_id>/', views.comment())
]
и в вашем views.py :
# parameters request & event_id
@require_http_methods(["POST"])
def comment(request, event_id):
form = CommentForm(request.POST)
if form.is_valid():
# get event by id
try:
event = Event.objects.get(id=event_id)
except ObjectDoesNotExist:
# redirect to somewhere because the event does not exists
return redirect()
# and last step
comment = form.save(commit=false)
comment.event = event
comment.save()
return redirect("event")