我有一个有树场的模型“形成”:
abbr a CharField;is_supplementary a BooleanField;description a 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())。更新:所有条目都属于相同的查询集,因此不同的内容应该发生在单个表单实例中。
更新
User模型发布于 2014-09-01 09:05:25
我认为您需要的是覆盖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_WIDGEThttps://stackoverflow.com/questions/25602095
复制相似问题