在 Django 中使用 CreateView 传递数据

Dan*_*Dan 0 python django

我收到错误:

NOT NULL 约束失败:film_comment.film_id

在评论页面上有一个名为 body 的表单字段,用于评论本身,我还需要它来存储针对用户和电影的评论。

楷模:

from django.db import models
from django.urls import reverse

class Film(models.Model):
    title = models.CharField(max_length=200)
    director = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    pub_date = models.DateField('date published')

    def get_absolute_url(self):
        return reverse('films:detail', kwargs={'pk' : self.pk})

class Comment(models.Model):
# user = models.ForeignKey(User, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    film = models.ForeignKey(Film, on_delete=models.CASCADE)
    body = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

意见:

from django.views import generic
from .models import Film, Comment
from django.views.generic.edit import CreateView, UpdateView, DeleteView

class IndexView(generic.ListView):
    # model = Film
    template_name = 'films/index.html'
    # context_object_name = 'object_list'

    def get_queryset(self):
        return Film.objects.all()

class DetailView(generic.DetailView):
    model = Film
    template_name = 'films/detail.html'


class CommentCreate(CreateView):
    model = Comment
    fields = ['body']
Run Code Online (Sandbox Code Playgroud)

网址:

app_name = 'films'

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    # path('<int:film_id>/comment', views.add_comment, name='add_comment'),
    path('<int:pk>', views.DetailView.as_view(), name='detail'),
    path('<int:film_id>/comment/', views.CommentCreate.as_view(), name='add_comment'),
]
Run Code Online (Sandbox Code Playgroud)

用于添加评论的详细信息页面上的链接:

<a href="{% url 'films:add_comment' film_id=film.id %}">Leave a comment</a>
Run Code Online (Sandbox Code Playgroud)

comment_form.py:

<form action="" method="post">
    {% csrf_token %}
    {% include 'films/form-template.html' %}
    <button type="submit">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

表单模板:

{% for field in form %}

{{field.errors}}

<label>{{ field.label_tag }}</label>
{{ field }}

{% endfor %}
Run Code Online (Sandbox Code Playgroud)

表格.py

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('body',)
Run Code Online (Sandbox Code Playgroud)

nev*_*ner 5

您需要覆盖视图的form_valid方法以使用当前用户和电影更新新评论实例:

class CommentCreate(CreateView):
    model = Comment
    fields = ['body']

    def form_valid(self, form):
        film = Film.objects.get(pk=self.kwargs['film_id']) 
        form.instance.user = self.request.user         
        form.instance.film = film 
        return super(CommentCreate, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

要修复“No URL redirect to”,您可以get_absolute_url()向 Comment 模型添加方法:

def get_absolute_url(self):
    return reverse('detail', kwargs={'pk': self.film.pk})
Run Code Online (Sandbox Code Playgroud)