我想按用户状态更改选择选项的标签。
我的模特是
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,textinput for book.name和book.catgory的选项。
我的目标是
如果用户输入== 1:
=>显示类别的label_1
如果用户输入== 2:
=>显示类别的label_2
我知道“__unicode__”可以显示实例的值,但我想知道用户的状态更改其字段。
任何人都知道解决方案吗?
添加: 我的观点和模型非常简单。
视图是
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'}),
}
答案 0 :(得分: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
用于选择字段没有意义,因此我从category
中删除了widgets
。
最后,修改您的视图,使其以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