【问题标题】:How to create a form in Django from a model with multiple ForeignKey and ManytoManyField fields?如何从具有多个 ForeignKey 和 ManytoManyField 字段的模型在 Django 中创建表单?
【发布时间】:2021-04-13 19:14:50
【问题描述】:

我是 Django 新手。我不知道如何创建一个能正确显示我的模型的表单,它有两个ForeignKey 字段和三个ManytoManyFields。我熟悉从更简单的模型创建表单,但我被困在这个模型上。到目前为止,我已经尝试过ModelForm 并将ModelChoiceField 用于ForeignKey 关系,但这不起作用。查看表单时,字段选项未呈现。然后我尝试了 inlineformset_factory 但我找不到有用的例子。任何帮助表示赞赏。 我正在尝试为模型创建 CreateView、UpdateView 和 DeleteView 选项。

models.py

    class Animal(models.Model):
        name = models.CharField(max_length=500, blank=False, null=False)
        **atype = models.ForeignKey(Type, on_delete=models.SET_NULL, blank=False, null=True)**
        **ageGroup = models.ForeignKey(AgeGroup, max_length=300, on_delete=models.SET_NULL, blank=False, null=True)**
        ageYears = models.PositiveIntegerField(blank=False, null=False)
        ageMonths = models.PositiveIntegerField(blank=True, null=True)
        sex = models.CharField(max_length=100, choices=SEX, blank=False, null=False, default='NA')
        city = models.CharField(max_length=200, blank=True, null=True)
        state = models.CharField(max_length=200, blank=True, null=True)
        country = models.CharField(max_length=250, blank=True, null=True)
        **breedGroup = models.ManyToManyField(BreedGroup, blank=False)**
        **breed = models.ManyToManyField(Breed, blank=False)**
        tagLine = models.CharField(max_length=300, blank=False, null=False)
        goodWithCats = models.BooleanField(blank=False, null=False, default='Not Enough Information')
        goodWithDogs = models.BooleanField(null=False, blank=False, default='Not Enough Information')
        goodWKids = models.BooleanField(null=False, blank=False, default='Not Enough Information')
        profilePic = ResizedImageField(size=[300, 450], quality=100, upload_to='media/', default='', null=True, blank=True, keep_meta=False)
        **contact = models.ForeignKey(ContactDetails, on_delete=models.SET_NULL, blank=False, null=True)**

forms.py

    class AnimalDetailsForm(ModelForm):
        ftype = ModelChoiceField(queryset=Type.objects.all())         #doesn't work
        ageGroup = ModelChoiceField(queryset=AgeGroup.objects.all()) #doesn't work
        #breed = what method to use?
        #breedGroup = what method to use? 

        class Meta:
            model = Animal
            exclude = ['ftype', 'ageGroup', 'breed', 'breedGroup']

【问题讨论】:

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


    【解决方案1】:

    此外,在表单的 Meta 中,您排除了您尝试为其获取数据的字段。应该说

    class Meta:
            model = Animal
            fields = ['type', 'ageGroup', 'breed', 'breedGroup']
    

    咨询过的文件:https://docs.djangoproject.com/en/3.1/topics/forms/modelforms/ https://docs.djangoproject.com/en/3.1/ref/models/fields/

    **编辑,删除关于使用类型作为变量名的评论。

    【讨论】:

    • 谢谢。我将更正关键字实例。我排除了这些字段,因为我在 Meta 类之上分别针对(或尝试)了它们。我首先尝试了一个简单的 ModelForm,将 fields 设置为 __all__,但这没有用。我开始认为我需要创建一个自定义表单,作为一个新手,这似乎有点令人生畏。
    • 对不起,我对关键字的事情有误。它不是保留的关键字之一。但是,最好使用描述性变量名称。所以也许会说它是什么类型,例如'狗类型'。在 python 中,变量名通常用下划线分隔,而不是混合大小写。
    • 也就是说,我认为您不需要制作自定义表单,因为问题在于渲染具有适当字段的表单。您需要做的是尝试简化版本。只有一个领域,一种形式。这样您就可以准确找出哪些字段导致了问题,并在将它们全部堆在一起之前尝试直接解决它们。由于您拥有大量的领域和关系,因此很难解决问题。
    • 只是出于好奇,如果您的表单看起来像这样,会呈现一些东西吗? class AnimalForm(forms.ModelForm): class Meta: model = Animal
    • 是的,好点。我能够弄清楚。 materialize.css 覆盖了阻止表单字段呈现的引导程序。
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多