Python Django ModelForm:定义未传递到模板中的值
我有一个模型表单,我只想将一些字段传递到模板中。我想在发送POST请求后保存一个特定字段以进行定义。以下是模型表单:Python Django ModelForm:定义未传递到模板中的值,python,django,modelform,Python,Django,Modelform,我有一个模型表单,我只想将一些字段传递到模板中。我想在发送POST请求后保存一个特定字段以进行定义。以下是模型表单: class CreateListingForm(ModelForm): class Meta: model = models.ListingModel fields = ['name', 'image', 'description', 'price', 'category'] widgets = {
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
字段:
现在,当我说print(form.owner)
时,结果是正确的。但是,当我保存模型表单时,所有者字段保留为空。我是否没有正确定义所有者
字段的值?您不应该将模型表单
与其包装的实例混淆。它为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.instance.owner = request.user.username
form.save()
return redirect('name-of-some-view')
else:
form = forms.CreateListingForm()
return render(request, 'auctions/createlisting.html', {
'CreateListingForm': form
})
@login\u必需(重定向\u字段\u名称=登录\u视图)
def创建_列表(请求):
如果request.method==“POST”:
form=forms.CreateListingForm(request.POST、request.FILES)
如果form.is_有效():
form.instance.owner=request.user.username
form.save()
返回重定向('name-of-some-view')
其他:
form=forms.CreateListingForm()
返回呈现(请求'auctions/createlisting.html'{
“CreateListingForm”:表单
})
其中,'name-of-some-view'
应替换为某个视图的名称,如果表单有效,则重定向到该视图
您应该考虑将<代码> CharField <代码> > <代码>所有者>代码>。假设用户稍后更改了他们的
用户名
,那么您的列表模型
不再是指真正的用户。您不应该将模型表单
与它正在包装的实例混淆。它为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.instance.owner = request.user.username
form.save()
return redirect('name-of-some-view')
else:
form = forms.CreateListingForm()
return render(request, 'auctions/createlisting.html', {
'CreateListingForm': form
})
@login\u必需(重定向\u字段\u名称=登录\u视图)
def创建_列表(请求):
如果request.method==“POST”:
form=forms.CreateListingForm(request.POST、request.FILES)
如果form.is_有效():
form.instance.owner=request.user.username
form.save()
返回重定向('name-of-some-view')
其他:
form=forms.CreateListingForm()
返回呈现(请求'auctions/createlisting.html'{
“CreateListingForm”:表单
})
其中,'name-of-some-view'
应替换为某个视图的名称,如果表单有效,则重定向到该视图
您应该考虑将<代码> CharField <代码> > <代码>所有者>代码>。假设用户稍后更改其
用户名
,则您的列表模型
不再引用真实用户。form.save(commit=True)将仅保存您在meta类中已定义的字段。如果您想在POST调用后保存额外字段,则应使用不同的方法。一种可能的方法是对ListingModel使用post_save信号。form.save(commit=True)将只保存您在meta类中已定义的字段。如果您希望在post调用后保存额外字段,则应使用不同的方法。一种可能的方法是为ListingModel使用post_保存信号。您的解决方案有效。我刚刚实现了它。非常感谢。你的解决方案奏效了。我刚刚实现了它。非常感谢。