【问题标题】:How to set initial data in a FormMixin and DetailView如何在 FormMixin 和 DetailView 中设置初始数据
【发布时间】:2020-09-15 06:53:28
【问题描述】:

我想使用通用外键创建评论表单,但是在获取表单中 object_id 和 content_type 的初始数据时遇到了麻烦?

class Comment(models.Model):
    user    =   models.ForeignKey(User, on_delete=models.CASCADE)
    content_type=   models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id   =   models.PositiveIntegerField()
    content_object=   GenericForeignKey()
    parent=   models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE)
    content  =   RichTextField()
    time_stamp  =   models.DateTimeField(auto_now_add=True)

Forms.py

class CommentsForm(forms.ModelForm):
    content_type    =   forms.CharField(widget=forms.HiddenInput)
    object_id       =   forms.IntegerField(widget=forms.HiddenInput)
    content         =   forms.CharField(widget=forms.Textarea(attrs={
        'class':'form-control',
        'cols':'4',
        'rows':'3'
    }))

    class Meta:
        model   =   Comment
        fields  =   ['content','user','object_id', 'content_type']

Views.py

class SongDetail(FormMixin, DetailView):
    model       =   Song
    form_class  =   CommentsForm

    def post(self, request, *args, **kwargs):
        obj = self.get_object()
        if not request.user.is_authenticated:
            return redirect('music:obj.get_absolute_url()')

        if form.is_valid():
            form.save()
            return self.form_valid(form)

【问题讨论】:

    标签: django django-models django-forms django-views mixins


    【解决方案1】:

    你可以这样试试:

    class SongDetail(ModelFormMixin, DetailView):
        model       =   Song
        form_class  =   CommentsForm
    
        def get_initial(self):
            obj = self.get_object()
            return { 'content_type': obj.content_type, 'object_id': obj.object_id }
    
        def post(self, request, *args, **kwargs):
            if not request.user.is_authenticated:
                return redirect('music:obj.get_absolute_url()')
            
            form = self.get_form()
            if form.is_valid():
                return self.form_valid(form)
            else:
                return self.form_invalid(form)
    

    仅供参考,我使用的是ModelFormMixin 而不是FormMixin,因为它提供了内置的保存功能。

    在这里,我将覆盖 get_initial 方法以从中返回 content_typeobject_id。然后将这些值传递给表单并作为初始值加载。

    【讨论】:

    • 感谢您的回复......我正在使用 python3.8 和 django==3.1.1,但仍然无法获取 Content_Type 实例
    猜你喜欢
    • 2012-08-28
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2018-05-06
    • 2010-12-01
    相关资源
    最近更新 更多