Django-在模板中向每个m2m对象添加一个Integerfield

时间:2019-01-08 21:35:53

标签: python django

我正在尝试添加功能,以在模板中的每个“ stockItem”旁边添加一个IntegerField,以便用户可以键入需要多少个该项目,然后在“ Stock”模型中更新“ count”值。就目前而言,它仅在用户仅选择一项时才起作用。 (我知道我现在如何实现此目标将永远行不通,但我会尝试展示我打算如何实现此目标)

型号:

class Machine_Service(models.Model):
title = models.CharField(max_length = 100)
stockItem = models.ManyToManyField(Stock)
date = models.DateTimeField(default=timezone.now)
comment = models.TextField()
machine = models.ForeignKey(Machine, on_delete=models.CASCADE)

def __str__(self):
    return self.title

class Stock(models.Model):
title = models.CharField(max_length=100)
count = models.IntegerField(default=10)
minLimit = models.IntegerField(default=1)
resellerCompany = models.CharField(max_length=100)
resellerPerson = models.CharField(max_length=100)
resellerEmail = models.EmailField()

def __str__(self):
    return self.title

(我不考虑“机器”模型,因为它不属于这个问题)

视图:

def CreateService(request):
if request.method == 'POST':
    form = CreateServiceForm(request.POST)
    if form.is_valid():
        m = Machine.objects.get(id=form['machine'].value())
        service = Machine_Service(title=form['title'].value(), date=form['date'].value(), comment=form['comment'].value(), machine=m)
        service.save()
        items = form['stockItem'].value()
        for item in items:
            s = Stock.objects.get(id=item)
            service.stockItem.add(s)

        service.save()

        return redirect('Machines-Home')
else:
    form = CreateServiceForm()

context = {
'form': form
}

表格:

class CreateServiceForm(forms.ModelForm):
count = forms.IntegerField(required=False)    
class Meta:
    model = Machine_Service
    fields = ['title', 'stockItem', 'count', 'date', 'comment', 'machine'] 

模板: (我不需要用脆皮)

{% extends "maskinNytt/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
    <form method="POST">
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">New Post!</legend>
            {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Post</button>
        </div>
    </form>
</div>
{% endblock content %}

1 个答案:

答案 0 :(得分:0)

在您的情况下,您的models.py应该如下所示:

class Machine_Service(models.Model):
    stockItem = models.ManyToManyField(Stock, through='NeededItems')
    ...

class Stock(models.Model):
    ...

class NeededItem(models.Model):
    machine_service = models.ForeignKey(Machine_Service, on_delete=models.CASCADE)
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    amount = models.IntegerField()

要指定此数量并将其用于视图/表单,您只需创建NeededItem的实例。

我假设您有一个用于MachineService的表单,一个用于NeededItem的表单。对于NeededItems,您需要一个FormSet,views.py:

from django import formset_factory
NeededItemFormset = formset_factory(NeededItemForm, extra=2)

def view(request):
    if request.method == 'POST':
        machine_form = MachineForm(request.POST, prefix='machine')
        needed_item_formset = NeededItemFormset(request.POST, prefix='items')
        if machine_form.is_valid() and needed_item_formset.is_valid():
            machine_form.save()
            needed_item_formset.save()
            return redirect('blabla')
    else:
        machine_form = MachineForm()
        needed_item_formset = NeededItemFormset()
    return render('template', {'m_form': machine_form, 'n_form': needed_item_formset})

模板可能看起来像这样。

<form>
  {% machine_service_form.as_p %}
  {% needed_item_formset.as_p %}
</form>

(我没有对此进行测试,因此我不保证它会起作用,但是我认为您应该有足够的指针来确定您需要哪些东西)。

当一个人制作一个Machine_Service时,他们还需要一个NeededItem模型的表单(或多个表单)。这意味着您在创建Stock时基本上可以忽略Machine_Service模型。