2017-11-09 1 views
1

ユーザのステータスで選択肢のラベルを変更したい。djangoユーザー状態によって__str__ラベルを変更する方法は?

私のモデルは

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.catgoryためbook.nameと選択肢のためのTextInputを持っています。

ユーザタイプ== 1ならば私の目標は
です:私は "__unicode__を" 知っている
=>表示カテゴリのlabel_2


=>表示カテゴリのlabel_1

場合、ユーザタイプ== 2インスタンスの値を表示することができますが、ユーザーの状態によってそのフィールドを変更することを知りたいと思います。

誰もが解決策を知っていますか?

add: my 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() 

で、フォームには2つのカスタムモデルフィールドを作成するために

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

'__unicode__'メソッドでは、' request'へのアクセス権がないので、これを行うことはできません。あなたのビューとフォームを表示する場合は、あなたが望むことをするためにそれらを変更することができるかもしれません。 – Alasdair

+0

@Alasdairご助言ありがとうございます!私は私のポストに私のビューとフォームを追加します。彼らに「要求」を渡す方法を教えてくれませんか? – Ryae

答えて

0

サブクラス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を使用して、ログインしているユーザーのみがビューにアクセスできることを確認してください。

+0

多くの感謝!!!できます ! – Ryae

関連する問題