我正在构建一个应用程序,管理人员可以在其中创建一个私人网页,他们需要手动添加人员才能访问该页面。

我不希望经理看到所有用户,所以我只想在列表中呈现PK。

我的views.py

class HotelCreateView(LoginRequiredMixin, CreateView):
model = Hotel
form_class = HotelForm

def form_valid(self, form):
    form.instance.manager_hotel = self.request.user
    return super().form_valid(form)


表格

from django.db import models
from django.forms import ModelForm
from .models import Hotel

class ColleagueChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
         return obj.get_pk()

class HotelForm(models.Model):
    ColleagueModelChoiceField(queryset=Colleague.objects.filter(pk))

最佳答案

您在fields上设置了CreateView,因此让Django为您自动生成ModelForm。表单使用从ModelMultipleChoiceField派生的ModelChoiceField,描述为here

如果您阅读了该部分的最后一段,您将看到该字段的显示值来自模型的__str__方法,或者可以用label_from_instance()方法覆盖它。

因此,这就是您需要做的,在ModelMultipleChoiceField上覆盖此方法。但是要做到这一点,您需要指定自己的形式。

所以:


为您的Hotel模型(HotelForm)创建自己的ModelForm。
创建ModelMultipleChoiceFieldColleagueChoiceField)的子类,并覆盖label_from_instance()方法以显示pk
colleagues上的HotelForm字段设置为ColleagueChoiceField
删除视图上的fields属性,并将form_class设置为HotelForm

关于python - 在CreateView中呈现PK而不是用户名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54983551/

10-12 19:10