使用 Django 中的表单将产品变体添加到数据库

问题描述

首先,我是 Django 的新手,如果我有任何愚蠢的问题,我提前为浪费您的时间道歉。

我正在尝试在 Django 中创建一个电子商务项目,并且需要将产品变体添加数据库中。这样做的正确方法是什么?我已经走了这么远,但不能再进一步了。如果您能提供帮助,我将不胜感激。

我想做什么:

  • 生成”按钮根据选择生成所有可能的变体为 html(Javascript)。
  • “提交”按钮发布表单
  • 尝试将变体保存到数据库

错误 SkuForm.variation_value1 不是 VariationValuesModel 的实例。

Variation Section ScreenShot

表格:

class ProductsForm(forms.ModelForm):
    class Meta:
        model  = ProductsModel
        fields = ['name',]


class SkusForm(forms.ModelForm):
    variation_value1 = forms.ModelMultipleChoiceField(queryset=VariationValuesModel.objects.filter(variation_id=2).order_by("name"),required=False,widget=forms.SelectMultiple(attrs={
        'id'            : 'var_color','class'         : 'form-control selectpicker','title'         : 'Select Color',}))
    variation_value2 = forms.ModelMultipleChoiceField(queryset=VariationValuesModel.objects.filter(variation_id=1).order_by("name"),widget=forms.SelectMultiple(attrs={
        'id'            : 'var_size','title'         : 'Select Size',}))
    variation_value3 = forms.ModelMultipleChoiceField(queryset=VariationValuesModel.objects.filter(variation_id=3).order_by("name"),widget=forms.SelectMultiple(attrs={
        'id'            : 'var_pattern','title'         : 'Select Pattern',}))

    
    class Meta:
        model  = SkusModel
        fields = ['variation_value1','variation_value2','variation_value3',]

型号:

class ProductsModel(models.Model):
    name             = models.CharField(max_length = 200,blank=False,null=False,class SkusModel(models.Model):
    product          = models.ForeignKey(ProductsModel,related_name='product_sku',on_delete=models.DO_nothing)
    variation_value1 = models.ForeignKey(VariationValuesModel,related_name='VariationValue1_sku',blank=True,null=True,on_delete=models.DO_nothing)
    variation_value2 = models.ForeignKey(VariationValuesModel,related_name='VariationValue2_sku',on_delete=models.DO_nothing)
    variation_value3 = models.ForeignKey(VariationValuesModel,related_name='VariationValue3_sku',on_delete=models.DO_nothing)

class VariationValuesModel(models.Model):
    name             = models.CharField(max_length = 200,editable=True,unique=False,default="Default variation value name")

查看:

def ProductCreate(request):
    if request.method == "POST":
        product_form    = ProductsForm(request.POST)
        sku_form        = SkusForm(request.POST)

        #if form submit
        if 'addproduct_submit' in request.POST:  
            #if product has variations
            if 'variation_value1' in request.POST or 'variation_value2' in request.POST or 'variation_value3' in request.POST:
                if product_form.is_valid():
                    form         = product_form.save(commit=False)
                    form.company = request.user.company
                    product      = product_form.save()
                    
                    for var1 in request.POST.getlist('variation_value1'):
                        var1 = VariationValuesModel.objects.get(id=var1)
                    
                    for var2 in request.POST.getlist('variation_value2'):
                        var2 = VariationValuesModel.objects.get(id=var2)

                    for var3 in request.POST.getlist('variation_value3'):
                        var3 = VariationValuesModel.objects.get(id=var3)
                        
                        SkusModel.objects.create(
                            product = product,variation_value1 = var1,variation_value2 = var2,variation_value3 = var3,)
                    
                else:
                    messages.info(request,'The informations are invalid,please try again.') 
            #if simple product (no variations)   
            else:
                if product_form.is_valid() and sku_form.is_valid() and image_form.is_valid():
                    form = product_form.save(commit=False)
                    form.company = request.user.company
                    product = product_form.save()

                    sku     = sku_form.save(commit=False)
                    sku.product = product
                    sku.save()
                    
                    messages.info(request,'The product saved.')
                    return HttpResponseRedirect(request.Meta.get('HTTP_REFERER','redirect_if_referer_not_found'))
                else:
                    messages.info(request,please try again.')
    #if not submit redirect to category select page
    else: 
        return redirect('product-category-select')
    
    context = {
        'product_form'   : product_form,'sku_form'       : sku_form,}

    return render(request,'pages/product_add.html',context)

模板:

<!-- variations -->
{% if variations %}
    {% for var in variations %}
        <div class="form-group row">
                <label class="col-form-label text-left col-lg-1 col-sm-12">{{ var }}</label>
                <div class="col-lg-3 col-md-9 col-sm-12">
                    {% if var.id == 2 %}   
                        {{ sku_form.variation_value1 }}
                    {% elif var.id == 1 %}
                        {{ sku_form.variation_value2 }}
                    {% elif var.id == 3 %}
                        {{ sku_form.variation_value3 }}
                    {% endif %}
                </div>
        </div>
    {% endfor %}
<button id="var_generate" type="button" class="offset-lg-1 btn btn-warning mr-2">Generate</button>
{% else  %}
    <span>There is no variations info.</span><br>
{% endif %}
<!-- variations end -->

***This is what "Generate Button" create for variations***

<td>
    <input type="hidden" class="form-control" name="variation_value1" readonly="" value="3">
    <input type="text" class="form-control" disabled="" value="Black">
</td>
<td>
    <input type="hidden" class="form-control" name="variation_value2" readonly="" value="2">
    <input type="text" class="form-control" disabled="" value="M">
</td>
<td>
    <input type="hidden" class="form-control" name="variation_value3" readonly="" value="4">
    <input type="text" class="form-control" disabled="" value="Square">
</td>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)