0

在不让用户从父模型中选择的情况下保存外键字段的最佳方法是什么?假设我有这些模型

楷模

class Category(models.Model):
    category_id = models.AutoFiled(primary_key=True)

class Brand(models.Model):
    brand_id = models.AutoFiled(primary_key=True)

class Product(models.Model):
    category = models.ForeignKey(Category)
    brand = models.ForeignKey(Brand)
    name = models.CharField(max_length = 10, blank=True)

形式

Class ProductForm(forms.ModelForm):
    class Meta:
        Model = Product
        fields = ['name']

意见

def create_product(request):
    if request.method == "POST":
        form = ProductForm(request.POST or None)
        if form.is_valid():
            form.save()
            messages.success(request, 'Successfully Saved!', 'alert-success')
            return redirect('products')
   else:
        return render(request, ' manageproducts/create_product.html', {'form':form})

我希望用户只输入一个名称,但在数据库中我想要一个表单来发布 category_id、brand_id 和名称。我怎样才能做到这一点?

4

1 回答 1

1

您可以尝试HiddenInput小部件,它会呈现为<input type="hidden" ...>. 但这需要一些js代码在表单提交前提供正确category 和值brand

from django import forms

class ProductForm(ModelForm):
    class Meta:
        model = Product
        fields = ('category', 'brand', 'name')
        widgets = {
            'category': forms.HiddenInput(),
            'brand': forms.HiddenInput()
        }

更新

def update_product(request, pk=None):
    try:
        product = Product.ojbects.get(pk=pk)
    except Product.DoesNotExist:
        raise Http404

    form = ProductForm(request.POST or None, instance=product)
    if request.method == "POST":
        if form.is_valid():
            # category and brand will be unchanged
            form.save()
            messages.success(request, 'Successfully Saved!', 'alert-success')
            return redirect('products')
    else:
        return render(request, ' manageproducts/create_product.html', {'form':form})

不选择categorybrand仅对更新合理,创建新产品必须选择新的品类和品牌,否则会破坏外键约束

于 2020-06-30T15:43:59.537 回答