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")
Вернуться на верх