【问题标题】:Rendering PK instead of username in CreateView在 CreateView 中渲染 PK 而不是用户名
【发布时间】:2019-03-04 12:44:19
【问题描述】:

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

我不想让管理员看到所有用户,所以我想只渲染列表中的 PK。

我的意见.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)

forms.py

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))

【问题讨论】:

  • 列表视图在哪里?
  • 您的要求不明确
  • @AnjaneyuluBatta 什么不清楚? JPG 我不想对 ListView 进行任何更改,我只希望 HotelCreateView 中的表单呈现 PK 而不是选择字段中的用户名
  • 您需要提供更多信息。什么选择领域?什么用户名?是为了colleague 字段吗?请展示酒店模型。
  • @DanielRoseman 我编辑了。选择字段是一个 ManyToManyField,它使用来自 django.contrib.auth.models 的用户。是的,它是给同事领域的

标签: python django django-views django-class-based-views


【解决方案1】:

你在你的CreateView 上设置fields,所以你让Django 自动为你生成ModelForm。该表单使用ModelMultipleChoiceField,它派生自ModelChoiceField,描述为here

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

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

所以:

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

【讨论】:

  • 很抱歉,但我想不通我试过了:forms.py:从 django 导入表单类 HotelForm(forms.Form):collectorurs = forms.ColleagueChoiceField(label_from_instance ('pk')) 好吗?
  • 你应该创建一个 ModelForm 而不仅仅是一个 Form,阅读this。不,label_from_instance()ModelMultipleChoiceField 上的一个方法,所以你需要先继承它,就像我说的那样,然后覆盖该方法。您需要完成我提到的所有 4 个步骤。
  • @dirkgrotten,查看我更新的代码。我从来没有使用过modelForm,所以可能有很大的错误
  • 您没有阅读我提出的有关 ModelForm 的链接,否则您会知道您必须指定 modelfields。特别是this section 关于如何自定义字段。更改field_classes 的示例正是您正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2021-10-12
相关资源
最近更新 更多