Django 字段';id';期望一个数字,但得到<;位于0x03F53528>;的属性对象-

Django 字段';id';期望一个数字,但得到<;位于0x03F53528>;的属性对象-,django,django-views,foreign-keys,slug,Django,Django Views,Foreign Keys,Slug,我正在构建一个注册应用程序,需要根据特定的用户模型实例注册人员。我的URL基于我的用户的slug和人们可以在特定用户处注册的那些值。例如,人们可以在苹果店或香蕉店登记。发布的表单包含特定的user.id,它与填写的表单字段一起传递给人员模型 现在我遇到了以下错误,我无法理解: 字段“id”需要一个数字,但得到了 我的网址: app_name = 'register' urlpatterns = [ path('<slug>/contact/', ContactView.as

我正在构建一个注册应用程序,需要根据特定的用户模型实例注册人员。我的URL基于我的用户的slug和人们可以在特定用户处注册的那些值。例如,人们可以在苹果店或香蕉店登记。发布的表单包含特定的user.id,它与填写的表单字段一起传递给人员模型

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

字段“id”需要一个数字,但得到了

我的网址:

app_name = 'register'

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

我的观点

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

这里我遗漏了什么?

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

对于
slug
URL参数,您可以使用
get\u object\u或\u 404
检索相应的
Bedrijf

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

首先,主席先生,谢谢你作出广泛而深入的答覆。这让我意识到我有很多样板代码,并向我展示了一种修复方法。深入到Django文档中,我现在对基于类的视图的get_context_数据、get_success_url和form_有效方法的理解好多了

我稍微调整了一下您的示例,因为get_context_数据中的slug没有定义

bedrijf=get_object_或_404(bedrijf,slug=self.kwargs['slug'])完成了这个任务。我现在只问自己,上面的slug=self.kwargs['slug']是否是样板代码

在get_success_url方法中,它表示“bedankt”没有相反的含义。通过在其前面指定app_名称修复了此问题,如:

返回反向('register:bedankt',kwargs={'slug':self.object.bedrijf.slug})

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