如何在一个表单中编辑两个不同的模型

时间:2015-08-09 22:20:22

标签: django forms models

我有两个型号。首先,您可以创建产品名称并编写价格。第二个型号是包含这些产品的购物车。

现在我想创建一个表单,用户可以在购物车中提出产品成本。 例如,我创建了cart1,其中包含product1和product2。我希望有可能以购物车形式编辑这个价格。

我该怎么办?这是我的代码:

models.py

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField(default='0')

    def __unicode__(self):
        return u"{}({})".format(self.name, self.price)

class Cart(models.Model):
    product = models.ManyToManyField(Product)
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

forms.py

class CartForm(forms.ModelForm):
        product = forms.ModelMultipleChoiceField(queryset = Product.objects.all(), widget=forms.CheckboxSelectMultiple(),required=True) 
        name = forms.CharField(max_length=45, label='nazwa')
        price = forms.IntegerField(label='price')


        class Meta: 
                model = Cart
                fields = ('product', 'name', 'price')

这是照片我拥有的和我想要的(现在我有一个价格 - 对于所有产品,我想要一个产品的价格):

enter image description here

第二个问题:现在我有复选框,我该怎么办没有复选框或列表但是一切都必须自动选择(用户必须从这个购物车中选择所有产品)。

编辑: 现在我有了这个:

    class CartForm(forms.ModelForm):
            product = forms.ModelMultipleChoiceField(queryset = Product.objects.all(), widget=forms.CheckboxSelectMultiple(),required=True) 
            name = forms.CharField(max_length=45, label='nazwa')
            price = forms.IntegerField(label='price')


            class Meta: 
                    model = Cart
                    fields = ('product', 'name', 'price')

    IngredientFormSet = inlineformset_factory(Cart, Product)

views.py:

def cart_new(request):
    if request.method == "POST":
        form = CartForm(request.POST)
        if form.is_valid():
            cart = form.save(commit=False)
            cart.save()
            form.save_m2m()
            ingredient_formset = IngredientFormSet(request.POST)
            if ingredient_formset.is_valid():
                ingredient = formset.save(commit=False)
                ingredient_formset.save()
                return redirect('shop.views.cart_detail', pk=cart.pk)
    else:
        form = CartForm()
    return render(request, 'shop/cart_edit.html', {'form': form})

2 个答案:

答案 0 :(得分:1)

您可以使用InlineFormSetView提供的Django Extra Views。以下是从doc:

复制的示例
from extra_views import InlineFormSetView


class EditProductReviewsView(InlineFormSetView):
    model = Product
    inline_model = Review

    ...

答案 1 :(得分:0)

首先,您需要一个子模型(产品)的formset。然后在您的视图中,您应该同时访问:主模型的表单和子模型的formset并保存它。表格的一个例子:

from django import forms
from django.forms.models import inlineformset_factory

# ... import here your models

class CartForm(forms.ModelForm):

    class Meta: 
            model = Cart
            fields = ('product', 'name', 'price')

IngredientFormSet = inlineformset_factory(Cart, Product)

然后在您的视图中使用它。