首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据列值使用不同的小部件呈现来自一个字段的条目?

如何根据列值使用不同的小部件呈现来自一个字段的条目?
EN

Stack Overflow用户
提问于 2014-09-01 08:50:56
回答 1查看 55关注 0票数 1

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

  1. abbr a CharField;
  2. is_supplementary a BooleanField;
  3. description a TextField。

模型

代码语言:javascript
复制
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关系的一部分)

代码语言:javascript
复制
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模型
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 09:05:25

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

代码语言:javascript
复制
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')})

这就是我的例子,我认为它将帮助你理解如何实现你所需要的。在表单声明中,我认为我发送的用户如下:

代码语言:javascript
复制
form = MyForm(user=request.user)

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

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25602095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档