字段 'id' 需要一个数字,但得到了 <property object at 0x03F53528>。 -
Field 'id' expected a number but got <property object at 0x03F53528>. -
我正在构建一个注册应用程序,需要根据特定的用户模型实例来注册人员。我的 url 基于我的用户的 slug,并基于人们可以在特定用户处注册的那些值。例如,人们可以在 Apples 或 Bananas 注册。发布的表单包含特定的 user.id,它与填写的表单字段一起传递给人员模型。
现在我收到以下错误,我无法理解:
字段 'id' 需要一个数字,但在 0x03CC54B0 处得到了 <属性 对象>。
我的网址:
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')
我在这里错过了什么?
查询Bedrijf.objects.get(pk=Bedrijf.pk)
没有多大意义,因为Bedrijf
是class,所以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 = <b>get_object_or_404(</b>Bedrijf, slug=slug<b>)</b>
context = {'form': form, 'slug': slug}
return render(self, self.template_name, context)
def post(self, request, *args, **kwargs):
slug = self.kwargs['slug']
bedrijf = <b>get_object_or_404(</b>Bedrijf, slug=slug<b>)</b>
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-based 视图来删除大量样板代码:
class ContactView(CreateView):
template_name = 'register/contact.html'
form_class = BezoekerForm
def <b>get_context_data</b>(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', <b>kwargs={'slug': self.object.bedrijf.slug}</b>)
def form_valid(self, form):
form.instance.bedrijf = <b>get_object_or_404(</b>Bedrijf, slug=self.kwargs['slug']<b>)</b>
return super().form_valid(form)
首先感谢楼主广泛而深入的解答。这让我意识到我有很多样板代码,并向我展示了解决这个问题的方法。深入了解 Django 文档,我现在对基于 class 的视图的 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 反转('register:bedankt', kwargs={'slug': self.object.bedrijf.slug})
我正在构建一个注册应用程序,需要根据特定的用户模型实例来注册人员。我的 url 基于我的用户的 slug,并基于人们可以在特定用户处注册的那些值。例如,人们可以在 Apples 或 Bananas 注册。发布的表单包含特定的 user.id,它与填写的表单字段一起传递给人员模型。
现在我收到以下错误,我无法理解:
字段 'id' 需要一个数字,但在 0x03CC54B0 处得到了 <属性 对象>。
我的网址:
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')
我在这里错过了什么?
查询Bedrijf.objects.get(pk=Bedrijf.pk)
没有多大意义,因为Bedrijf
是class,所以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 = <b>get_object_or_404(</b>Bedrijf, slug=slug<b>)</b>
context = {'form': form, 'slug': slug}
return render(self, self.template_name, context)
def post(self, request, *args, **kwargs):
slug = self.kwargs['slug']
bedrijf = <b>get_object_or_404(</b>Bedrijf, slug=slug<b>)</b>
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-based 视图来删除大量样板代码:
class ContactView(CreateView):
template_name = 'register/contact.html'
form_class = BezoekerForm
def <b>get_context_data</b>(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', <b>kwargs={'slug': self.object.bedrijf.slug}</b>)
def form_valid(self, form):
form.instance.bedrijf = <b>get_object_or_404(</b>Bedrijf, slug=self.kwargs['slug']<b>)</b>
return super().form_valid(form)
首先感谢楼主广泛而深入的解答。这让我意识到我有很多样板代码,并向我展示了解决这个问题的方法。深入了解 Django 文档,我现在对基于 class 的视图的 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 反转('register:bedankt', kwargs={'slug': self.object.bedrijf.slug})