简体   繁体   English

以 Django 形式使用来自 url 的 pk

[英]Use pk from url in django form

In my django app I have a table which contains a button that redirects you to a form like this:在我的 django 应用程序中,我有一个表格,其中包含一个按钮,可以将您重定向到这样的表单:

<a href="{% url 'employee:delivered_docket_form' docket.pk %}" class="btn btn-primary">Create Delivered Docket</a>

Urls.py网址.py

path('delivered-docket/add/<int:pk>/', DeliveredDocketFormView.as_view(),
                                        name='delivered_docket_form')

Views.py视图.py

@method_decorator([login_required, employee_required], name='dispatch')
class DeliveredDocketFormView(CreateView):
    model = DeliveredDocket
    form_class = DeliveredDocketeditform
    template_name = 'packsapp/employee/docketDeliveredForm.html'

    def form_valid (self, form):
        product = form.save(commit=False)
        product.save()
        data = form.cleaned_data
        print("form data is ", data)
        print("pk is ",self.kwargs['pk'])
        messages.success(self.request, 'The Delivered Docket was created with success!')
        return redirect('employee:delivered_docket_table')

I am able to access the pk in the views function by self.kwargs['pk'] but how can I access it in the formclass.我能够访问pk的看法按功能self.kwargs['pk']但我怎么能访问它在formclass。 Here's my form这是我的表格

Forms.py表单.py

class DeliveredDocketeditform(forms.ModelForm):
    class Meta:
        model = DeliveredDocket
        fields = '__all__'

What I want to add in the form is something like this:我想在表单中添加的是这样的:

class DeliveredDocketeditform(forms.ModelForm):
    class Meta:
        model = DeliveredDocket
        fields = '__all__'


    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['sender'].queryset = Warehouse.objects.id(id = ??)

How do I get pk to this query ??我如何获得此查询的 pk ?

You can override get_initial method in your view to pass initial data to the form:您可以在视图中覆盖get_initial方法以将初始数据传递给表单:

class DeliveredDocketFormView(CreateView):
    model = DeliveredDocket
    form_class = DeliveredDocketeditform
    template_name = 'packsapp/employee/docketDeliveredForm.html'

    def get_initial(self):
        initial = super().get_initial()
        initial['sender'] = Warehouse.objects.get(pk=self.kwargs['pk'])
        return initial

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM