具有ForeignKey的Django ModelForm

时间:2019-01-15 01:08:48

标签: python python-3.x django-models django-forms

我有2个模型,项目 OnHand 项目代表产品,如USB键盘,而 OnHand 代表实际的USB键盘。

class Item(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=100)
    manufacturer = models.ForeignKey(Manufacturer, blank=True, null=True, on_delete=models.SET_NULL)
    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
    vendor = models.ForeignKey(Vendor, blank=True, null=True, on_delete=models.SET_NULL)
    vendor_sku = models.CharField(max_length=80, default='000000000')
    replenish_threshold = models.IntegerField(max_length=1000, default=10)
    max_onhand = models.IntegerField(max_length=10000, default=30)
    introduction = models.DateField(auto_now=True)
    tags = models.ManyToManyField(Tag)
    slug = models.SlugField(max_length=100, default=slugify(name))

    class Meta:
        verbose_name_plural = 'items'

    def __str__(self):
        return self.name

class OnHand(models.Model):
    name = models.CharField(max_length=100)
    serial = models.CharField(max_length=80, default='Consumable')
    asset = models.CharField(max_length=20, null=True, blank=True)
    product = models.ForeignKey(Item, blank=True, null=True, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)


    class Meta:
        verbose_name_plural = 'items on hand'

    def __str__(self):
        if not self.serial:
            return self.name
        return self.serial

我有一个 ModelForm ,用于添加新的 Items OnHand ,我使用的表单位于 /库存/ add_onhand // ,因此/inventory/add_onhand/1/可以为主键为1的 Item 的库存添加键盘。

class OnHandForm(forms.ModelForm):
    class Meta:
        model = OnHand
        fields = {'name', 'asset', 'serial',}

def add_onhand(request, query):
    if request.method == "POST":
            form = OnHandForm(request.POST)
            if form.is_valid():
                    form.save()
                    return redirect('view_item')
    else:
        print(query)
        form = OnHandForm()
        item = Item.objects.get(pk=query)
        return render(request, 'add_onhand.html', {'form':form, 'item':item})

通过此表单保存新的 OnHand 时,如何将关系指向 Item

1 个答案:

答案 0 :(得分:0)

我仍然希望有一个更好的解决方案,但是与此同时,我所做的工作已将product添加到了表单中,但是使用了JQuery隐藏元素并根据{{1}自动选择它}的主键。

这很容易,但是可以。我希望有一个更优雅的解决方案。