我有一个带有树木字段的模型'Formation':
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'))
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
模型答案 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__