【问题标题】:Customize inline_formset field display of foreign key自定义外键的inline_formset字段显示
【发布时间】:2011-03-06 00:45:37
【问题描述】:

我有一个名为 Access 的模型,它链接到其他两个模型。

class Access (models.Model):
    portfolio_id = models.ForeignKey(Portfolio)
    user_id = models.ForeignKey(User)
    title = models.CharField(max_length=30, null=True, blank=True)
    access_rights = models.PositiveIntegerField(choices=ACCESS_CHOICES)

我已经创建了这个表单。

class UserAccessForm(forms.ModelForm):
    class Meta:
    model = Access

我在视图中有这个。

AccessFormSet = inlineformset_factory(Portfolio,
                                      Access,
                                      form=UserAccessForm,
                                      extra=1,
                                      can_delete=False)
cAccessFormSet = AccessFormSet(instance=cPorfolio)

问题出在网页中,user_id 显示为一个选择字段,为我提供了所有用户的列表(即“jane15”、“tom54”)。我希望它是一个必须有人输入用户名的文本字段。当我尝试如下自定义它时,它会显示“用户 ID”而不是“用户名”(即“1”、“2”)。

class UserAccessForm(forms.ModelForm):
    user_id = forms.ChoiceField(required=True, widget=forms.TextInput)
    class Meta:
        model = Access

如何让表单集显示和接受用户名(即“jane15”)作为文本字段而不是选择字段?

【问题讨论】:

    标签: python django inline-formset


    【解决方案1】:

    好吧,如果您想输入用户名,那么选择字段不是最好的选择。

    使用CharField(即<input type='text'>)并覆盖clean_FOO 方法来验证用户实例的输入或引发错误消息。

    class UserAccessForm(forms.ModelForm):
        user_id = forms.CharField()
    
        class Meta:
            model = Access
    
        def clean_user_id(self):
            data = self.cleaned_data.get('user_id')
            try:
                user = User.objects.get(username=data)
            except User.DoesNotExist:
                raise forms.ValidationError("No user exists by that username")
            return user
    

    将它传递到您的表单集中,您就完成了。

    【讨论】:

    • 这是我已经尝试过的。这会导致我的用户显示为他们的用户 ID 而不是他们的用户名。出于安全原因,我需要用户名并且没有下拉列表。
    • 不幸的是,您可以覆盖添加功能,但是在查看数据时,实际的表格字段只有一个数字。
    • 是的,这是我的问题。我怎样才能解决这个问题?
    • 我尝试创建一个具有自己的 format_value 方法 / value_from_datadict 的自定义小部件,但它最终失败了,因为它通过新值的模型验证。我认为答案在小部件渲染中的某个地方。我会继续试验
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多