Python django如何根据用户状态更改_str________)标签?

Python django如何根据用户状态更改_str________)标签?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我想按用户状态更改选择选项的标签 我的模型是 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

我想按用户状态更改选择选项的标签

我的模型是

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 for new book,该页面具有modelform、book.name的textinput和book.catgory的选项

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

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

我知道“\uuuUnicode\uuuuu”可以显示实例的值,但我想知道如何根据用户的状态更改其字段

有人知道解决办法吗

加: 我的视图和模型非常简单

观点是

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'}),
        }
子类创建两个自定义模型字段。覆盖
label\u from\u 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
作为关键字参数,并更改category字段以使用适当的model choice字段

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
作为选择字段是没有意义的,因此我从
小部件中删除了
类别

最后,修改视图,使其在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
子类创建两个自定义模型字段。覆盖
label\u from\u 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
作为关键字参数,并更改category字段以使用适当的model choice字段

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
作为选择字段是没有意义的,因此我从
小部件中删除了
类别

最后,修改视图,使其在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

您不能在
\uuuuunicode\uuuu
方法中执行此操作,因为您没有访问
请求的权限。如果您显示您的视图和表单,您可能可以更改它们以执行您想要的操作。@Alasdair感谢您的建议!我在我的帖子中添加了我的视图和表单。您能告诉我如何将“请求”传递给他们吗?您不能在
\uuuuuunicode\uuuuu
方法中执行此操作,因为您没有访问
请求的权限。如果您显示您的视图和表单,您可能可以更改它们以执行您想要的操作。@Alasdair感谢您的建议!我在我的帖子中添加了我的视图和表单。你能告诉我如何把“请求”传递给他们吗?