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' 应替换为您重定向到的某个视图的名称,以防表单有效。

不过,您应该考虑将 ownerCharField 更改为 ForeignKey [Django-doc]。想象一下,稍后用户更改了他们的 username,然后您的 ListingModel 不再指代真实用户。