ModelForm中的ManyToMany字段自定义HTML

0 投票
1 回答
546 浏览
提问于 2025-04-17 07:41

我现在正在制作一个表单,用来在我的网站上显示某个特定产品的信息。每个价格用一个叫做Price的对象表示,而每个Item都有几个与之相关的Price对象。我已经创建了一个ModelForm来展示我的Item的数据,这个部分是正常工作的。不过,当我尝试在我的ModelForm中显示多对多字段时,出现了一个小框框,里面列出了我所有的Price对象。我需要为这些Price对象显示自定义的HTML,这样我才能让它们和我写的一些JavaScript互动。以下是我目前的代码:

class Item(models.Model):
    user        = models.ForeignKey(User)
    name        = models.CharField(max_length=200)
    description = models.CharField(max_length=1000)
    category    = models.ForeignKey(Category)
    prices      = models.ManyToManyField(Price, blank=True)
    images      = models.ManyToManyField(Image)
    runs        = models.ManyToManyField(ActivityRun, blank=True)
    date_added  = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.name

class ItemForm(ModelForm):
    class Meta:
        model = Item
    description = forms.CharField(widget=TinyMCE())

@login_required
def edit_item(request, item_id):
    item = get_object_or_404(Item, pk=item_id)
    if request.method == 'POST':
        form = ItemForm(request.POST, request.FILES, instance=item)
        if form.is_valid():
            return HttpResponseRedirect("/items/")
    else:
        form = ItemForm(instance=item)

    return render(request, 'edit_item.html', {'form': form})

还有我想要展示的模板部分:

{% for price in form.prices %}
    <span class="price_box" style="width: 200px;">
        <a href="#" class="remove_price">x</a>{{ price.name }} ${{ price.price }}
    <input type="hidden" name="price_name" value="{{ price.name }}">
    <input type="hidden" name="price_cost" value="{{ price.price }}">
    </span>
{% endfor %}

我不太确定该怎么做才能实现这个功能……

更具体一点,我该怎么改变表单中多对多显示的HTML呢?

1 个回答

0

一种方法是使用内联模型表单集来编辑你的价格。这可能需要你修改你的物品模型,把物品与价格的关系从多对多(M2M)改为单对多(FK),也就是说,物品应该作为价格的外键。

这样一来,你就可以为价格使用一个自定义表单,并且可以有一个或多个价格表单实例,这些实例会自动和一个物品关联。这个表单集还会有删除功能,如果你愿意的话,可以通过Ajax来处理。你也可以动态地添加或移除表单。

希望这对你有帮助。

撰写回答