[英]Django Formset Redirect with pk/id
我正在嘗試將表單集的父ID傳遞到視圖中,但是由於某種原因,它似乎對我不起作用。 我在其他應用程序中沒有任何問題,但是這個特定的程序返回“ None”作為pk。 唯一的區別是我的表單集模型通常不包含外鍵關系。 如果我自己渲染父級,則可以很好地傳遞pk。 請幫忙 :)
異常值:找不到帶有關鍵字參數'{'pk':None}'的'company-detail'。 嘗試了1個模式:['客戶/(?P [0-9a-z-] +)/詳細信息/ $']
'''urls.py'''
url(r'^(?P<pk>[0-9a-z-]+)/detail/$', CompanyDetailView.as_view(),
name='company-detail'),
'''forms.py'''
class CompanyCreateForm(forms.ModelForm):
class Meta:
model = CompanyModel
fields = [
'name',
'website',
'rate',
]
widgets = {
'name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': ''}),
'website': forms.URLInput(attrs={
'class': 'form-control',
'placeholder': ''}),
'rate': forms.NumberInput(attrs={
'class': 'form-control',
'placeholder': ''}),
}
SitesFormSet = inlineformset_factory(
CompanyModel,
SiteModel,
fields=('street1',
'street2',
'city',
'state',
'zipcode',
'country',
'phone',
'distance',
),
widgets={
'street1': forms.TextInput(attrs={
'class': 'form-control'
}),
'street2': forms.TextInput(attrs={
'class': 'form-control'
}),
'city': forms.TextInput(attrs={
'class': 'form-control'
}),
'state': forms.TextInput(attrs={
'class': 'form-control'
}),
'zipcode': forms.NumberInput(attrs={
'class': 'form-control'
}),
'country': forms.TextInput(attrs={
'class': 'form-control'
}),
'phone': forms.TextInput(attrs={
'class': 'form-control'
}),
'distance': forms.NumberInput(attrs={
'class': 'form-control'
})
},
extra=1
)
'''views.py'''
def companycreateview(request):
if request.method == 'POST':
companyform = CompanyCreateForm(request.POST)
if companyform.is_valid():
company = companyform.save(commit=False)
sitesform = SitesFormSet(request.POST, request.FILES, instance=company)
if sitesform.is_valid():
company.save()
sitesform.save()
return redirect('customers:company-detail', pk=company.pk)
else:
companyform = CompanyCreateForm()
sitesform = SitesFormSet()
context = {
'company': companyform,
'sites': sitesform,
}
return render(request, 'customers/new-company.html', context)
class CompanyDetailView(DetailView):
model = CompanyModel
context_object_name = 'company'
template_name = 'customers/company-detail.html'
def get_context_data(self, **kwargs):
context = super(CompanyDetailView, self).get_context_data(**kwargs)
context['sites'] = SiteModel.objects.filter(company=self.get_object())
context['contacts'] = ContactModel.objects.filter(site__company=self.get_object())
context['reports'] = ServiceReportModel.objects.filter(site__company=self.get_object())
return context
'''new-company.html.html'''
<form action="" method="post">
{% csrf_token %}
<div class="form-row">
<div class="form-group col-md-12 form-col-md form-col-right-just {% if report.equipment.errors %}bg-danger{% endif %}">
<label for="{{ company.name.id_for_label }}"><Strong>Company Name</Strong></label></a>
{{ company.name }}
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12 form-col-md form-col-right-just {% if report.equipment.errors %}bg-danger{% endif %}">
<label for="{{ company.website.id_for_label }}"><Strong>Website</Strong></label></a>
{{ company.website }}
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12 form-col-md form-col-right-just {% if report.equipment.errors %}bg-danger{% endif %}">
<label for="{{ company.rate.id_for_label }}"><Strong>Hourly Rate</Strong></label></a>
{{ company.rate }}
</div>
</div>
{{ sites.management_form }}
{{ sites.non_form_errors }}
{% for child_form in sites %}
{{ child_form.sites_id.as_hidden }}
{{ child_form.company.as_hidden }}
<div class="form-row">
<div class="form-group col-md-12 form-col-md">
<label for="{{ child_form.id_for_label }}"><Strong>{{ child_form.label }}</Strong></label>
{{ child_form }}
{% if child_form.errors %}
{% for error in child_form.errors %}
{{ error|escape }}
{% endfor %}
{% endif %}
</div>
</div>
{% endfor %}
<div class="form-row">
<div class="form-group col-md-12 form-col-md form-col-left-just">
<button type="submit" class="btn btn-primary btn-detail"><Strong>Submit</Strong></button>
</div>
</div>
</form>
我認為您需要對網址格式進行一些小的更改。 該錯誤表明以下模式未找到匹配項:
['customers/(?P[0-9a-z-]+)/detail/$']
嘗試在?P
之后直接添加<pk>
:
customers/(?P<pk>[0-9a-z-]+)/detail/$
在您的urls.py
:我認為您錯過了urlpatterns中的pk
。
url('customers/(?P<pk>[0-9a-z-]+)/detail/$',.......)
在您views.py
:
作為編碼縮進,如果sitesform
無效,則它將嘗試重定向。 但是company
尚未保存到數據庫中。 因此pk
為None
。 代碼應如下所示:
if companyform.is_valid():
company = companyform.save(commit=False)
sitesform = SitesFormSet(request.POST, request.FILES, instance=company)
if sitesform.is_valid():
company.save()
sitesform.save()
return redirect('customers:company-detail', pk=company.pk)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.