【问题标题】:Link the current user to a field in ModelForm django将当前用户链接到 ModelForm django 中的字段
【发布时间】:2021-04-03 16:43:21
【问题描述】:

我正在使用 django 开发一个商业网站。登录的用户可以创建列表。我正在使用 django 模型为表单创建模型和 ModelForm。

models.py

from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):
    pass

class Listing(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField(max_length=500)
    starting_bid = models.IntegerField()
    image_url = models.URLField(blank=True)
    category = models.CharField(max_length=15, blank=True)
    listed_by = models.ForeignKey(User, on_delete=models.CASCADE)

Listing(models.Model) 的最后一个字段用于存储列出列表的用户,该列表应基于当前登录的用户。

forms.py

from django import forms

from .models import Listing


class ListingForm(forms.ModelForm):
    class Meta:
        model = Listing
        fields = ["title", "description", "starting_bid", "image_url", "category"]

没有listed_by 字段的forms.py 按预期工作。

views.py

def create(request):
    """Renders a Form to Create a Listing"""

    if request.method == "POST":

        # Create a form instance and populate it with data from the request:
        form = ListingForm(request.POST)

        if form.is_valid():
            # Save a new Listing object from the form's data.
            listing = form.save()

            # Redirects the users to the main page
            return HttpResponseRedirect(reverse("index"))

        # If the form is not valid, render the template with errors
        return render(request, 'auctions/create_listing.html', {"form": form})

    # Create a form instance and pass it to the template
    form = ListingForm()
    return render(request, "auctions/create_listing.html", {"form": form})

在这里,我对我如何处理这个表单进行了分类。

问题

当我想将当前登录的用户链接到Listing 模型时,我的问题就出现了,所以我搜索了一些答案,但不幸的是,由于我使用的是 ModelForm,我并没有消除我的顾虑。

我尝试了什么? 我已经阅读了这方面的文档以及其中的 stackoverflow 的答案:

建议的链接是解决我的问题的最佳方法吗?如果是这样,我应该如何使用它?我应该在 models.pyforms.py 还是 views.py 中使用它?

有更好的方法吗?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    您可以在不保存的情况下获取模型对象并使用commit=False添加到它

    if form.is_valid():
        # Save a new Listing object from the form's data.
        listing = form.save(commit=False)
        listing.listed_by = request.user
        listing.save()
    

    【讨论】:

      【解决方案2】:

      解决问题的最佳方法是在views.py 中添加listed_by

      根据Django's Documentation.

      如果您在 commit=False 的情况下调用 save(),那么它将返回一个尚未保存到数据库的对象...如果您想在保存之前对对象进行自定义处理,这很有用。 ..

      所以在views.py 中添加以下内容:

      if form.is_valid():
          # Save a new Listing object from the form's data.
          listing = form.save()
      
          listing.listed_by = request.user
          listing.save()
      
          # Redirects the users to the main page
          return HttpResponseRedirect(reverse("index"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-28
        • 2021-01-22
        • 1970-01-01
        • 2011-11-10
        • 1970-01-01
        • 2015-06-25
        • 2018-03-14
        相关资源
        最近更新 更多