首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django form to formset

Django form to formset
EN

Stack Overflow用户
提问于 2020-07-28 18:07:13
回答 2查看 101关注 0票数 1

我目前正在学习Django forms,我偶然发现了this post

其中一个表单当前看起来如下所示:

我想要做的是将Category更改为formset,并能够在创建产品时渲染多个下拉列表。

我的models.py:

代码语言:javascript
复制
class Category(models.Model):
    name = models.CharField(max_length=30)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Product(models.Model):
    name = models.CharField(max_length=30)
    price = models.DecimalField(decimal_places=2, max_digits=10)
    category = models.ForeignKey(Category, on_delete = models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

我的forms.py:

代码语言:javascript
复制
class CategoryForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ('name', )


class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ('name', 'price', 'category', )

    def __init__(self, user, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        self.fields['category'].queryset = Category.objects.filter(user=user)

Views.py中的当前方法:

代码语言:javascript
复制
@login_required
def new_product(request):
    if request.method == 'POST':
        form = ProductForm(request.user, request.POST)
        if form.is_valid():
            product = form.save(commit=False)
            product.user = request.user
            product.save()
            return redirect('products_list')
    else:
        form = ProductForm(request.user)
    return render(request, 'products/product_form.html', {'form': form})

products_form.html:

代码语言:javascript
复制
{% extends 'base.html' %}

{% block content %}
  <h1>New product</h1>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="save">
    <a href="{% url 'products_list' %}">cancel</a>
  </form>
{% endblock %}

我尝试使用modelformset_factory并在views.py中更改方法,方法是创建一个CategoryFormSet,如下所示:

代码语言:javascript
复制
CategoryFormSet = modelformset_factory(Category, fields=('name', ), extra=2)
formset = CategoryFormSet(data=data, queryset=Category.objects.filter(user=request.user))

然后用创建的表单集替换views.py中的原始表单。在html中,我只需将{{form}}替换为{{formset}}。在尝试了一段时间之后,我要么得到了只有一个提交按钮(没有呈现表单)的New product,要么得到了一个没有get error属性的User对象。我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2020-07-28 18:33:31

本教程的重点是允许用户添加/更新一个模型的多个实例。你想要编辑一个东西,多个相关的东西内联。

但是,您的数据模型只允许每个产品有一个类别,所以这没有任何意义。你是否希望每个产品有多个类别,这是只有你才能回答的问题:) -我假设你想要。

首先,您需要更改模型,以允许每个产品具有多个类别:

代码语言:javascript
复制
class Product(models.Model):
    name = models.CharField(max_length=30)
    price = models.DecimalField(decimal_places=2, max_digits=10)
    categories = models.ManyToManyField(Category, related_name='products')
    user = models.ForeignKey(User, on_delete=models.CASCADE)

然后,您需要了解Inline Formsets

如果你被困在这一点上,请带着具体的信息回来。

票数 0
EN

Stack Overflow用户

发布于 2020-07-28 18:10:55

而不是创建新的模型类别。你可以做到这一点。

代码语言:javascript
复制
CATEGORY_CHOICES= ( 
    ("1", "1"), 
    ("2", "2"), 
    ("3", "3"), 
    ("4", "4"), 
    ("5", "5"), 
    ("6", "6"), 
    ("7", "7"), 
    ("8", "8"), 
)
category = models.CharField(max_length = 20,choices = CATEGORY_CHOICES,default = '1')

它将自动以HTML格式呈现。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63131691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档