首页 文章

如何根据列值从具有不同窗口小部件的一个字段中呈现条目?

提问于
浏览
1

我有一个带有树田的模型“形成”:

  • abbr 一个CharField;

  • is_supplementary 一个BooleanField;

  • description 一个TextField .

型号

class User(AbstractUser):
    """User attach to a working site/location"""
    site = models.ForeignKey('Site')
    role = models.ManyToManyField(Role, blank=True, null=True)
    formations = models.ManyToManyField('Formation')
    objects = UserManager()

class Formation(models.Model):
    """Available formations."""
    abbr = models.CharField(max_length=8, help_text=_('Abbréviation'))
    description = models.TextField(blank=True, null=True)
    is_supplementary = models.BooleanField(help_text=_('Formations complémentaires'))

Forms.py

Formation 模型如下使用(它是m2m关系的一部分)

class InternalActorForm(forms.ModelForm):
    # group = forms.CharField(max_length=100)
    username = forms.CharField(max_length=30)

    class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
            'username',
            'password',
            'email',
            'phone',
            'formations'
        )
        widgets = {
            'password': PasswordInput(),
            'formations': CheckboxSelectMultiple()
        }

问题

目前,所有条目都使用单个小部件 CheckboxSelectMultiple() 呈现 .

如何根据列值从具有不同窗口小部件的一个字段中呈现条目?

  • 条目 is_supplementary=True 作为一组复选框;

  • ,同时将 is_supplementary=False 渲染为 select (即 SelectMultiple() ) .

Update: 所有条目都属于 same queryset ,因此不同的内容应该在单个表单实例中发生 .

更新

  • 添加 User 型号

1 回答

  • 1

    我认为你需要的是覆盖 def __init__(self, *args, **kwargs) . 我将向您展示一个示例,根据数据,我使用一些小部件或省略它们:

    class MyForm(forms.Form):       
        first_name = forms.CharField(max_length=30, required=False)
        last_name = forms.CharField(max_length=30, required=False)
        password = forms.CharField(max_length=128, widget=forms.PasswordInput, required=False)
        password2 = forms.CharField(max_length=128, widget=forms.PasswordInput, required=False)
    
        class Meta:
            model = MyModel
    
        def __init__(self, *args, **kwargs):
            # I send this user where I initialize the form
            self.user = kwargs.pop('user', None)  
            super(MyForm, self).__init__(*args, **kwargs)
            # Now you can define the widgets to use depending on your conditions
            if self.user:  # If I receive the user I select this widget
                self.fields['profile_role'] = forms.CharField(max_length=25, widget=forms.Select(choices=self.user.profile.getUserRoles()))
            # And I define here other widgets
            self.fields['username'].widget = forms.TextInput(attrs={'placeholder': _(u'Nombre de Usuario')})
            self.fields['first_name'].widget = forms.TextInput(attrs={'placeholder': _(u'Nombre')})
            self.fields['last_name'].widget = forms.TextInput(attrs={'placeholder': _(u'Apellidos')})
            self.fields['email'].widget = forms.TextInput(attrs={'placeholder': _(u'E-mail')})
    

    这是我的例子,我认为这将有助于您了解如何实现您的需求 . 在我的视图中的表单声明中,我发送这样的用户:

    form = MyForm(user=request.user)
    

    您可以在 __init__ 表单中发送您需要和接收的变量,并根据您的需要使用一个小部件或其他 .

    您需要将 formation 对象传递给存储 is_supplementary 的表单,然后在 __init__ 中执行以下操作:

    if your_object.is_supplementary:
        self.fields['YOUR_FIELD'].widget = forms.YOUR_DESIRED_WIDGET
    else:
        self.fields['YOUR_FIELD'].widget = forms.YOUR_OTHER_DESIRED_WIDGET
    

相关问题