Django - DetailView 与 FormMixin 和初始

xao*_*_xv 3 django

我有DetaiView对我的帖子,我想用这样的形式,这种观点,所以我决定用DetailViewFormMixin。我需要为此表格设置一些首字母,但我不知道该怎么做。这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

forms.py

class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = (
            "name",
            "email",
            "body"
        )
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

所以我想发CommentForm这个帖子DetailView。我希望你明白:D。

在此先感谢您的帮助!

nev*_*ner 5

有了FormMixin你可以指定表单的初始使用initial属性:

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

或 get_initial 方法:

def get_initial(self):
   return {"post": self.get_object() }
Run Code Online (Sandbox Code Playgroud)