将参数传递给Django CreateView

11

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

我无法确定如何确切地做到这一点。我猜想,在模板中,我想要像这样的东西:<a href="{% url create_sessions %}?class={{ object.pk }}>创建会话</a> 在类的 DetailView 中, 并且在我的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)

如果这明显是不正确的,请告诉我。谢谢!

2个回答

26

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'])

啊,太干净了。谢谢! - rfj001
如何将上下文传递给渲染数据以创建视图,关于此问题在SO中有一个问题:https://stackoverflow.com/questions/56325133/passing-rendered-data-to-createview - Joel Deleep

1

urls.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接