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

时间:2014-09-01 08:50:56

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

我有一个带有树木字段的模型'Formation':

  1. abbr CharField ;
  2. is_supplementary BooleanField ;
  3. description TextField
  4. 模型

    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())呈现。

    更新:所有条目都属于相同的查询集,因此不同的内容应该在单个表单实例中发生。

    更新

    • 添加User模型

1 个答案:

答案 0 :(得分: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的{​​{1}}对象转移到表单,然后在is_supplementary中执行以下操作:

__init__