Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在FormMixin和DetailView中设置初始数据_Django_Django Models_Django Forms_Django Views_Mixins - Fatal编程技术网

Django 如何在FormMixin和DetailView中设置初始数据

Django 如何在FormMixin和DetailView中设置初始数据,django,django-models,django-forms,django-views,mixins,Django,Django Models,Django Forms,Django Views,Mixins,我想使用泛型foreignkey创建一个注释表单,但是a在获取表单中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

我想使用泛型foreignkey创建一个注释表单,但是a在获取表单中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)
您可以这样尝试:

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)
仅供参考,我正在使用而不是
FormMixin
,因为它提供内置的保存功能


在这里,我重写了从中返回
content\u type
object\u id
的方法。然后这些值将被传递到表单并作为初始值加载。

感谢您的回复。。。。。。我使用的是python3.8和django==3.1.1,但在获取Content_类型实例时仍然有困难