簡體   English   中英

帶有pk / id的Django Formset Redirect

[英]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尚未保存到數據庫中。 因此pkNone 代碼應如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM