向 Django CreateView 传递参数

问题描述 投票:0回答:2

我正在尝试实现一个预约应用程序,用户可以在其中创建与预先存在的课程关联的会话。我想做的是使用 django CreateView 创建会话,而不询问用户关联的类,同时在后台为会话分配一个类。我尝试通过在 url 中传递类的 pk 来实现此目的,以便我可以在 CreateView 中查找该类并将该类分配给会话。

我不知道到底该怎么做。我猜测在模板中我希望在类的 DetailView 中包含类似

<a href="{% url create_sessions %}?class={{ object.pk }}>Create Session</a>
的内容,并在 urls.py 文件中包含包含以下行的 url
url(r'^create-sessions?class=(\d+)/$', CreateSessionsView.as_view(), name = 'create_sessions')
,但我对 django 还很陌生,不太明白这个参数发送到我的 CBV(基于类的视图)的位置以及如何使用它。

我将课程保存到会话中的计划是重写 CBV 中的

form_valid
为:

def form_valid(self, form):
    form.instance.event = event
    return super(CreateSessionsView, self).form_valid(form)

如果这明显不正确,也请告诉我。

谢谢!

django django-views django-class-based-views
2个回答
27
投票

GET 参数(?后面的参数)不是 URL 的一部分,并且在 urls.py 中不匹配:您可以从

request.GET
字典中获取该参数。但最好将该参数作为 URL 本身的一部分,因此其格式为“/create-sessions/1/”。

所以 urlconf 将是:

url(r'^create-sessions/(?P<class>\d+)/$', CreateSessionsView.as_view(), name='create_sessions')

现在链接可以是:

<a href="{% url create_sessions class=object.pk %}">Create Session</a>

现在在 form_valid 中你可以这样做:

event = Event.objects.get(pk=self.kwargs['class'])

1
投票

url.py

path('submit/request/<str:tracking_id>',      OrderCancellationRequest.as_view(),                name="cancel_my_order"),

模板

  <form method="POST">
    {% csrf_token %}
    {{form | crispy}}
    <button class="btn" type="submit">Submit</button>
  </form>  

查看

class MyView(CreateView):
    template_name   = 'submit_request.html'
    form_class      = MyForm
    model           = MyModel

    def form_valid(self, form, **kwargs):
        self.object = form.save(commit=False)
        self.object.created_at = datetime.datetime.now()
        self.object.created_for = self.kwargs.get('order_id')
        self.object.submitted_by = self.request.user.email

        super(MyView, self).form_valid(form)
        return HttpResponse("iam submitted")

    def get_context_data(self, **kwargs):
        context = super(MyView, self).get_context_data(**kwargs)
        context['header_text'] = "My Form"
        context['tracking_id'] = self.kwargs.get('order_id') 
        return context
© www.soinside.com 2019 - 2024. All rights reserved.