python - django 如何通过用户状态更改 __str__ 标签?

标签 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,页面有modelform、book.name的textinput和book.catgory的选项。

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

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

我知道“__unicode__”可以显示实例的值,但我想知道通过用户状态更改其字段。

有人知道解决办法吗?

添加: 我的观点和模型非常简单。

View 是

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'}),
        }

最佳答案

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

最后,修改您的 View ,使其包含 kwargs 形式的登录用户。使用 LoginRequiredMixin 确保只有登录用户才能访问该 View 。

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

关于python - django 如何通过用户状态更改 __str__ 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206529/

相关文章:

javascript - 如何在循环中使用ajax发送单个请求

python - 如何在django admin中分类?

python - wxpython phoenix 说 Frame init args 错误

python - 如何从 python 3 中的单个函数返回多个变量?

python - django,基于位置的搜索

python - 如何在 Django 中对模型进行两次过滤?

python - MySql 服务器上的 Django 模型导出

python - 使用 JSON 将数据从 Angular.js POST 到 Django REST API

python - 如何像 Django 存储用户一样在 Django 的后端 session 中存储对象

python - Django 中的 Meta 到底是什么?