【问题标题】:Field 'id' expected a number but got <property object at 0x03F53528>. -字段“id”需要一个数字,但得到 <property object at 0x03F53528>。 -
【发布时间】:2020-11-28 07:20:39
【问题描述】:

我正在构建一个注册应用程序,该应用程序需要根据特定的用户模型实例注册人员。我的网址是基于我的用户的蛞蝓,并基于人们可以在特定用户处注册的那些价值观。例如,人们可以在 Apples 或 Bananas 注册。发布的表单包含特定的 user.id,它与填写的表单字段一起传递给人员模型。

现在我收到以下错误,我无法理解:

字段 'id' 需要一个数字,但得到

我的网址:

app_name = 'register'

urlpatterns = [
    path('<slug>/contact/', ContactView.as_view(), name='contact'),
    path('<slug>/thanks/', ThanksView.as_view(), name='thanks'),
]

我的模型:

class Bedrijf(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    bedrijfsnaam = models.CharField(max_length=80, null=True)
    slug = models.SlugField(max_length=30)

class Bezoeker(models.Model):
    bedrijf = models.ForeignKey(Bedrijf, on_delete=models.CASCADE)
    voornaam = models.CharField(max_length=30)
    achternaam = models.CharField(max_length=50)

我的观点

class ContactView(CreateView):
    template_name = 'register/contact.html'
    form_class = BezoekerForm

    def get_success_url(self):
        return reverse('bedankt', kwargs={'slug': Bedrijf.slug})

    def get(self, request, *args, **kwargs):
        form = BezoekerForm
        slug = get_object_or_404(Bedrijf, slug=Bedrijf.slug)
        context = {'form': form, 'slug': slug}
        return render(self, self.template_name, context)

    def post(self, request, *args, **kwargs):
        bedrijf = Bedrijf.objects.get(pk=Bedrijf.pk)
        if request.method == 'POST':
            form = self.form_class(request.POST)
            if form.is_valid():
                new_register = form.save(commit=False)
                new_register.bedrijf = bedrijf.pk
                new_register.save()
            return reverse('bedankt')

我在这里错过了什么?

【问题讨论】:

    标签: django django-views foreign-keys slug


    【解决方案1】:

    首先,感谢先生广泛而深入的回答。这让我意识到我有很多样板代码,并向我展示了解决这个问题的方法。深入研究 Django 文档,我现在对基于类的视图的 get_context_data、get_succes_url 和 form_valid 方法有了更好的理解。

    我稍微调整了你的示例,因为 get_context_data 中的 slug 没有定义。

    bedrijf = get_object_or_404(Bedrijf, slug=self.kwargs['slug']) 成功了。我现在只问自己上面的 slug = self.kwargs['slug'] 是否是样板代码?

    在 get_success_url 方法中,它表示“bedankt”没有反向。通过在它前面指定 app_name 来解决这个问题:

    return reverse('register:bedankt', kwargs={'slug': self.object.bedrijf.slug})

    【讨论】:

      【解决方案2】:

      查询Bedrijf.objects.get(pk=Bedrijf.pk) 没有多大意义,因为Bedrijf 是类,所以Bedrijf.pk 只是一个属性。

      您可以使用get_object_or_404 来检索Bedrijf 对应的slug URL 参数:

      class ContactView(CreateView):
          template_name = 'register/contact.html'
          form_class = BezoekerForm
      
          def get(self, request, *args, **kwargs):
              form = BezoekerForm()
              slug = self.kwargs['slug']
              bedrijf = get_object_or_404(Bedrijf, slug=slug)
              context = {'form': form, 'slug': slug}
              return render(self, self.template_name, context)
      
          def post(self, request, *args, **kwargs):
              slug = self.kwargs['slug']
              bedrijf = get_object_or_404(Bedrijf, slug=slug)
              if request.method == 'POST':
                  form = self.form_class(request.POST, request.FILES)
                  if form.is_valid():
                      form.instance.bedrijf = bedrijf
                      form.save()
                  return reverse('bedankt', slug=slug)
              return render(self, self.template_name, {'slug': slug, 'form': form})

      但这实际上完成了所有工作。使用CreateView 之类的基于类的视图来删除大量样板代码:

      class ContactView(CreateView):
          template_name = 'register/contact.html'
          form_class = BezoekerForm
      
          def get_context_data(self, *args, **kwargs):
              context = super().get_context_data(*args, **kwargs)
              context.update(
                  slug=self.kwargs['slug'],
                  bedrijf = get_object_or_404(Bedrijf, slug=slug)
              )
              return context
      
          def get_success_url(self):
              return reverse('bedankt', kwargs={'slug': self.object.bedrijf.slug})
      
          def form_valid(self, form):
              form.instance.bedrijf = get_object_or_404(Bedrijf, slug=self.kwargs['slug'])
              return super().form_valid(form)

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 2021-06-25
        • 2021-08-31
        • 1970-01-01
        • 2021-07-03
        • 2021-06-03
        • 2021-01-22
        • 2021-01-22
        • 2021-07-30
        相关资源
        最近更新 更多