是否可以创建包含要更新的对象和表单列表的视图?

时间:2018-03-13 18:20:07

标签: python django django-forms class-based-views

我试图用django解决我最近2天的问题,我已经搜索了很多reddit帖子/ git repos / stack问题而且我什么也没做到。

我正在学习django并做一个项目来帮助我完成目前的工作。

我的目标是详细了解模型"合作伙伴"在哪里我会列出所有它" PartnerMugs"

models.py

class Partner(models.Model):
    partner_name = models.CharField(max_length=255)

    class Meta:
        ordering = ["partner_name"]

    def __str__(self):
        return self.partner_name

    def get_absolute_url(self):
        return reverse("partners:detail", kwargs={"pk":self.pk})

class PartnerMug(models.Model):
    partner     = models.ForeignKey('Partner', on_delete=models.CASCADE)
    pattern     = models.ForeignKey('patterns.Pattern', on_delete=models.CASCADE)
    xs_amount   = models.IntegerField(default=0)
    xl_amount   = models.IntegerField(default=0)

    class Meta:
        ordering = ["partner"]

    def __str__(self):
        return str(self.partner) + " " + str(self.pattern)

    def get_absolute_url(self):
        return reverse('partners:detail', args=[self.partner.pk])

问题是我不知道如何为每个" PartnerMug"我列表中的对象。我尝试用inlineformset_factory做一些事情,但我没有找到如何将它放入for循环中的方法。

form.py

class PartnerForm(forms.ModelForm):
    class Meta:
        model = Partner
        fields = ['partner_name']

class MugAmountForm(forms.ModelForm):
    class Meta:
        model = PartnerMug
        fields = ['xs_amount','xl_amount',]

MugAmountFormSet = inlineformset_factory(Partner, PartnerMug, form=MugAmountForm, extra=0)

更新了view.py:

view.py

def par_detail_view(request, pk=None):
    obj = Partner(pk=pk)

    mugsFormSet = inlineformset_factory(Partner, PartnerMug, form=MugAmountForm, extra=0)

    if request.method == "POST":
        mugsFormSet = mugsFormSet(request.POST, instance=obj)
        if mugsFormSet.is_valid():
            mugsFormSet.save()
    else:
        mugsFormSet = mugsFormSet(instance=obj)

    return render(request, 'partners/pattern_function.html', {
    'mugsFormSet':mugsFormSet,
    'obj':obj
})

更新了template.html

template.html

    {% extends "base.html" %}

{% block content %}

{% for partner_mugs in obj.partnermug_set.all  %}

        <div class="row">
            <div class="col-md-4 text-center">
                {% if partner_mugs.pattern.pattern_thumbnail %}
                    <img src="{{ partner_mugs.pattern.pattern_thumbnail.url }}" class="thumbnail">
                {% endif %}
            </div>
            <div class="col-md-8 text-center">
                <div class="row">
                     <div class="col-sm-12">
                        <h4>pattern:{{ partner_mugs.pattern }}</h4>
                    </div>
               </div>
                <div class="row">
                    <div class="col-md-6 text-center">
                            <p>small: {{ partner_mugs.xs_amount }}</p>                            
                    </div>
                    <div class="col-md-6 text-center">
                        <p>large: {{ partner_mugs.xl_amount }}</p>                        
                    </div>
                </div>
            </div>

        </div>       
        <hr>
    {% endfor %}

<form class="form-horizontal" action="" method="POST">
    {% csrf_token %}
    <fieldset>
        <legend>Profile</legend>
        <br>
{{ formset.management_form }}

<table class="table table-bordered table-hover table-condensed">

{% for form in mugsFormSet.forms %}



 {% if forloop.first %}
  <thead><tr>
    {% for field in form.visible_fields %}
    <th>{{ field.label|capfirst }}</th>
    {% endfor %}
  </tr></thead>
  {% endif %}
  <tr class="{% cycle "row1" "row2" %}">
  {% for field in form.visible_fields %}
    <td>
    {% if forloop.first %}
      {% for hidden in form.hidden_fields %}
      {{ hidden }}
      {% endfor %}
    {% endif %}
      {{ field.errors.as_ul }}
      {{ field }}
    </td>
  {% endfor %}
  </tr> 
  {% endfor %}
  </table>
    <input type="submit" value="save" class="btn" />  
</fieldset>
</form>
{% endblock content %}

我想在div中输入xs_amount的表单:

<div class="col-md-6 text-center">
     <p>Small: {{ partner_mugs.xs_amount }}</p>                            
</div>

xl_amount in:

 <div class="col-md-6 text-center">
     <p>Large: {{ partner_mugs.xl_amount }}</p>                            
 </div>

两种形式都在价值观之下。 甚至可以在同一时间内遍历对象及其形式吗?所有表格应该同时由一个按钮提交。

result

2 个答案:

答案 0 :(得分:0)

views.py上创建与您的网址相关联的功能。

我无法重新编写您的代码,但我认为您可能会发现我的示例很有用:

def profile(request):
    user = request.user     
    userform=UserForm(instance=user)

    addressFormSet=inlineformset_factory(User, ProfileAddress, form=ProfileAddressForm ,can_delete=False,extra=1)


if request.method == "POST":
    userform=UserForm(request.POST,instance=user)
    addressFormSet = addressFormSet(request.POST, request.FILES, instance=user)


    if userform.is_valid() and addressFormSet.is_valid() a:
       userform.save()
       addressFormSet.save()


else:
    addressFormSet = addressFormSet(instance=user.profile)


return render(request, 'template.html', {
    'userform':userform,
    'addressFormSet':addressFormSet,
})

<强> template.html

<form class="form-horizontal" action="" method="POST">
            {% csrf_token %}
            <fieldset>
                <legend>Profile</legend>

                {% include "form_snippet.html" with form=userform %}
                {% include "inlineTableForm.html" with formset=addressFormSet %}
            <input type="submit" value="save" class="btn" />  
</fieldset>
    </form>

<强> inlineTableForm.html

      <br>
{{ formset.management_form }}

<table class="table table-bordered table-hover table-condensed">

{% for form in formset.forms %}



 {% if forloop.first %}
  <thead><tr>
    {% for field in form.visible_fields %}
    <th>{{ field.label|capfirst }}</th>
    {% endfor %}
  </tr></thead>
  {% endif %}
  <tr class="{% cycle "row1" "row2" %}">
  {% for field in form.visible_fields %}
    <td>
    {% if forloop.first %}
      {% for hidden in form.hidden_fields %}
      {{ hidden }}
      {% endfor %}
    {% endif %}
      {{ field.errors.as_ul }}
      {{ field }}
    </td>
  {% endfor %}
  </tr> 
  {% endfor %}
  </table>

答案 1 :(得分:0)

我找到了解决问题的方法。我使用了@Walucas inlineformset_factory和函数视图。在&#34; inlineTableForm.html&#34;我使用&#34; form.instance&#34;获取我的对象的值:

<br>
{{ formset.management_form }}

<table class="table table-bordered table-hover table-condensed">
{% for form in formset.forms %}
  {% if forloop.first %}
    <thead>
      <tr>
        <th>Thumbnail:</th>
        <th>Pattern:</th>
        <th>xs:</th>
        <th>xl:</th>
      </tr>
    </thead>
  {% endif %}
    <tr class="{% cycle "row1" "row2" %}">
      <td><img src="{{ form.instance.pattern.pattern_thumbnail.url }}"     class="thumbnail"></td>
      <td>{{ form.instance.pattern }}</td>
      <td>{{ form.xs_amount }}</td>
      <td>{{ form.xl_amount }}</td>
        {% for hidden in form.hidden_fields %}
          {{ hidden }}
          {% endfor %}
        {{ form.errors.as_ul }}

    </tr>


{% endfor %}

现在我有每个对象缩略图,模式名称和表单的行以更改金额。 &#34; .instance&#34;在formset中是理解所有这些的关键