【问题标题】:django how to change __str__ label by user status?django 如何通过用户状态更改 __str__ 标签?
【发布时间】:2017-11-09 16:09:00
【问题描述】:

我想根据用户状态更改选择选项的标签。

我的模型是

class BookCategory(model):
    label_1 = char
    label_2 = char

    def __unicode__(self):
        #something here?

class Book(model):
    name = char
    categoey = models.Foreignkey(BookCategory)

BookCategory用于新书的createview,页面有modelform,book.name的textinput和book.catgory的choices。

我的目标是
如果用户类型==1:
=>显示类别的标签_1

如果用户类型==2:
=>显示类别的label_2

我知道“__unicode__”可以显示实例的值,但我想知道根据用户的状态改变它的字段。

有人知道解决办法吗?

添加: 我的 view 和 modelform 很简单。

视图是

class CreateBook(CreateView):
  template_name = "template.html"
  model = Book
  form_class = BookForm
  success_url = "success_url"

  def form_valid(self, form):
      if form.is_valid():
          form.save()

形式是

class LessonForm(ModelForm):
    class Meta:
        model = Book
        fields = ('name',
                  'category',
        )
        widgets = {
              'name': forms.Textarea(attrs={'class': 'text_box'}),
              'category': forms.Textinput(attrs={'class': 'select_box'}),
        }

【问题讨论】:

  • 您不能在__unicode__ 方法中执行此操作,因为您无权访问request。如果你展示你的视图和表单,你也许可以改变它们来做你想做的事情。
  • @Alasdair 谢谢你的建议!我在我的帖子中添加了我的观点和形式。你能告诉我如何向他们传递“请求”吗?

标签: python django django-models django-forms


【解决方案1】:

子类ModelChoiceField 创建两个自定义模型字段。覆盖 label_from_instance 以自定义您希望对象在表单中的显示方式。

class Type1CategoryField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.label1

class Type2CategoryField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.label1

然后更改您的表单,使其将user 作为关键字参数,并更改类别字段以使用适当的模型选择字段。

class LessonForm(ModelForm):
    class Meta:
        model = Book
        fields = ('name',
                  'category',
        )
        widgets = {
              'name': forms.Textarea(attrs={'class': 'text_box'}),
        }

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(LessonForm, self).__init__(*args, **kwargs)
        if user.user_type == 1:
            self.fields['category'] = Type1CategoryField(queryset=Category.objects.all())
        elif user.user_type == 2:
            self.fields['category'] = Type2CategoryField(queryset=Category.objects.all())

forms.Textinput 用于选择字段没有意义,因此我从您的widgets 中删除了category

最后,修改您的视图,使其包含 kwargs 表单中的登录用户。使用LoginRequiredMixin 确保只有登录用户才能访问视图。

from django.contrib.auth.mixins import LoginRequiredMixin

class CreateBook(LoginRequiredMixin, CreateView):
    template_name = "template.html"
    model = Book
    form_class = BookForm
    success_url = "success_url"

    def get_form_kwargs(self):
        kwargs = super(CreateBook, self).get_form_kwargs()
        kwargs['user'] = request.user

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 2021-09-15
    • 2017-03-10
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多