首页 > 解决方案 > Django - 带有 FormMixin 和初始的 DetailView

问题描述

我的帖子有 DetaiView,我想在这个视图中使用一个表单,所以我决定使用DetailViewwith FormMixin。我需要为此表单设置一些首字母,但我不知道该怎么做。这是我的代码:

models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
    name = models.CharField("Nick", max_length=80)
    email = models.EmailField()
    body = models.TextField("Body")
    created = models.DateTimeField("created", auto_now_add=True)
    updated = models.DateTimeField("Updated", auto_now=True)

forms.py

class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = (
            "name",
            "email",
            "body"
        )

views.py

class PostDetailView(FormMixin, DetailView):
    model = Post
    form_class = CommentForm
    template_name = "newspaper/post-detail.html"

    def get_success_url(self):
        return reverse("post-detail", kwargs={"slug": self.object.slug})

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context["form"] = self.get_form()
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)


    def form_valid(self, form):
        return super().form_valid(form)

所以我想CommentForm张贴这个DetailView。我希望你能理解:D。

在此先感谢您的帮助!

标签: django

解决方案


FormMixin您可以指定表单的初始使用属性initial

class PostDetailView(FormMixin, DetailView):
    model = Post
    form_class = CommentForm
    template_name = "newspaper/post-detail.html"
    initial={'name': 'John'}

或 get_initial 方法:

def get_initial(self):
   return {"post": self.get_object() }

推荐阅读