Django - ManyToManyField未在表单中显示

时间:2016-04-01 14:47:11

标签: python django django-models django-forms

我在language_tuples = models.ManyToManyField(LanguageTuple)中定义了UserProfile。当普通用户想成为翻译者时,应填写此字段。所以他应该能够选择尽可能多的语言元组 - 语言语言。

编辑:感谢尚旺,现在我可以选择多个LanguageTuples,但我无法在表单中创建新的LanguageTuple个对象。

class Language(models.Model):
    shortcut = models.CharField(max_length=40)
    name = models.CharField(max_length=40)

    def __str__(self):
        return self.name


class LanguageTuple(models.Model):
    language_from = models.ForeignKey(Language, related_name='language_from', null=True)
    language_to = models.ForeignKey(Language, related_name='language_to', null=True)

    def __str__(self):
        return '{} to {}'.format(self.language_from, self.language_to)

因此,我们假设数据库中已有多个Language对象,但没有LanguageTuple的实例。我希望user能够构建自己的元组(尽可能多)。因此,如果有语言CZ,EN,GE,SK - 他可以构建这些元组:CZ-EN,EN-CZ,GE-CZ,SK-GE等 - 在选择元组后,这些元组在数据库中创建作为常规LanguageTuple实例,如果不存在。

问题是表单在呈现时没有表单字段。不知道该怎么做......正如你所看到的,我已经在表单中添加了字段 - language_tuples

class TranslatorRegistrationForm(forms.Form):
    IBAN = forms.CharField(max_length=40,required=True)
    first_name = forms.CharField(max_length=40,required=True)
    last_name = forms.CharField(max_length=40,required=True)


    class Meta:
        model = UserProfile
        fields = (
        'first_name','last_name','IBAN','language_tuples'
        )

1 个答案:

答案 0 :(得分:2)

我在评论中已经提到过forms.ModelForm需要TranslatorRegistrationForm的一个问题,否则django将无法识别您要显示的所有字段。

如果您希望用户从language_tuples中选择以及创建新对,那么它将是2种形式。一个用于现有表单,另一个用于模型LanguageTuple的表单。您需要在模板中显示两个表单,以便人们可以从列表language_tuples中选择或填写LanguageTuple的表单。

现在请注意,您需要一些逻辑来检测用户是选择了现有的language_tuple还是尝试使用新创建的LanguageTuple。在将所有内容保存到数据库之前,这是一些额外的步骤,但它应该是直接的。