Django ModelForm:定义未传递到模板中的值
Django ModelForm: Defining a value not passed into the template
我有一个 ModelForm,我只想将 一些 字段传递到模板中。我想在 POST 请求发送后保存一个特定的字段来定义。这是模型表单:
class CreateListingForm(ModelForm):
class Meta:
model = models.ListingModel
fields = ['name', 'image', 'description', 'price', 'category']
widgets = {
'description': Textarea()
}
这是模特:
class ListingModel(models.Model):
name = models.CharField(max_length=30)
image = models.ImageField(upload_to='images')
description = models.CharField(max_length=1000)
price = models.PositiveIntegerField()
category = models.CharField(max_length=15)
objects = models.Manager()
owner = models.CharField(max_length=100)
在下一个代码块中,我尝试根据当前登录的用户 (request.user.username
) 定义 owner
字段:
@login_required(redirect_field_name=login_view)
def create_listing(request):
if request.method == "GET":
return render(request, "auctions/createlisting.html", {
"CreateListingForm": forms.CreateListingForm()
})
elif request.method == "POST":
form = forms.CreateListingForm(request.POST, request.FILES)
if form.is_valid():
try:
form.owner = request.user.username
print(form.owner)
form.save(commit=True)
except Exception:
return HttpResponseRedirect(reverse("create_listing_error"))
return HttpResponseRedirect(reverse("index")) #TODO
现在,当我说 print(form.owner)
时,结果是正确的。但是,当我保存 ModelForm 时,所有者字段留空。我没有正确定义 owner
字段的值吗?
您应该不要将ModelForm
与其包装的实例混淆。它为 form.owner
打印一些东西的事实并不奇怪,您首先 设置 一个名为 .owner
的属性,一个不存在的属性 之前。您应该设置 .instance
的 .owner
形式 :
@login_required(redirect_field_name=login_view)
def create_listing(request):
if request.method == 'POST':
form = forms.CreateListingForm(request.POST, request.FILES)
if form.is_valid():
form<b>.instance.owner = request.user.username</b>
form.save()
return redirect(<i>'name-of-some-view'</i>)
else:
form = forms.CreateListingForm()
return render(request, 'auctions/createlisting.html', {
'CreateListingForm': form
})
其中 'name-of-some-view'
应替换为您重定向到的某个视图的名称,以防表单有效。
不过,您应该考虑将 owner
的 CharField
更改为 ForeignKey
[Django-doc]。想象一下,稍后用户更改了他们的 username
,然后您的 ListingModel
不再指代真实用户。
我有一个 ModelForm,我只想将 一些 字段传递到模板中。我想在 POST 请求发送后保存一个特定的字段来定义。这是模型表单:
class CreateListingForm(ModelForm):
class Meta:
model = models.ListingModel
fields = ['name', 'image', 'description', 'price', 'category']
widgets = {
'description': Textarea()
}
这是模特:
class ListingModel(models.Model):
name = models.CharField(max_length=30)
image = models.ImageField(upload_to='images')
description = models.CharField(max_length=1000)
price = models.PositiveIntegerField()
category = models.CharField(max_length=15)
objects = models.Manager()
owner = models.CharField(max_length=100)
在下一个代码块中,我尝试根据当前登录的用户 (request.user.username
) 定义 owner
字段:
@login_required(redirect_field_name=login_view)
def create_listing(request):
if request.method == "GET":
return render(request, "auctions/createlisting.html", {
"CreateListingForm": forms.CreateListingForm()
})
elif request.method == "POST":
form = forms.CreateListingForm(request.POST, request.FILES)
if form.is_valid():
try:
form.owner = request.user.username
print(form.owner)
form.save(commit=True)
except Exception:
return HttpResponseRedirect(reverse("create_listing_error"))
return HttpResponseRedirect(reverse("index")) #TODO
现在,当我说 print(form.owner)
时,结果是正确的。但是,当我保存 ModelForm 时,所有者字段留空。我没有正确定义 owner
字段的值吗?
您应该不要将ModelForm
与其包装的实例混淆。它为 form.owner
打印一些东西的事实并不奇怪,您首先 设置 一个名为 .owner
的属性,一个不存在的属性 之前。您应该设置 .instance
的 .owner
形式 :
@login_required(redirect_field_name=login_view)
def create_listing(request):
if request.method == 'POST':
form = forms.CreateListingForm(request.POST, request.FILES)
if form.is_valid():
form<b>.instance.owner = request.user.username</b>
form.save()
return redirect(<i>'name-of-some-view'</i>)
else:
form = forms.CreateListingForm()
return render(request, 'auctions/createlisting.html', {
'CreateListingForm': form
})
其中 'name-of-some-view'
应替换为您重定向到的某个视图的名称,以防表单有效。
不过,您应该考虑将 owner
的 CharField
更改为 ForeignKey
[Django-doc]。想象一下,稍后用户更改了他们的 username
,然后您的 ListingModel
不再指代真实用户。