我试图用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>
两种形式都在价值观之下。 甚至可以在同一时间内遍历对象及其形式吗?所有表格应该同时由一个按钮提交。
答案 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中是理解所有这些的关键