基于Django类的泛型视图:基于contex将字段设置为初始值

2024-10-04 03:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django1.5应用程序中有一组相关模型:Events,它们有{},而{}属于{}。在

我正在努力为一个面向用户的注册表单创建一个基于类的通用视图,在该表单中,用户注册以参加EventSession。具体地说,问题在于排除注册所针对的字段{}在表单中呈现,同时仍然基于上下文和/或URL设置该值。在

我将首先通过一个用例来解释:

  1. 用户转到'/events/foo/bar',其中fooEvent,而{}是{}。在
  2. 在这个URL中,有一个链接注册EventSession,指向'/events/foo/bar/register/'。显示EventSessionRegistration模型的表单,但是没有在UI中选择EventSession,因为该信息已经由URL“设置”。在
  3. 成功提交表单后,用户将被重定向到静态“谢谢”页面。在

为了实现这一点,我有以下视图代码(许多其他导入除外):

from django.views.generic.edit import CreateView

class RegistrationCreate(CreateView):
    form_class = SessionRegistrationForm
    success_url = '/thanks/'
    template_name = 'events/registration_create.html'

    def get_context_data(self, *args, **kwargs):
        """Set the context of which Event, and which EventSession.
           Return 404 if either Event or EventSession is not public."""
        context = super(RegistrationCreate, self).get_context_data(**kwargs)
        s = get_object_or_404(
            EventSession,
            event__slug=self.kwargs['event_slug'],
            event__is_public=True,
            slug=self.kwargs['session_slug'],
            is_public=True)
        context['session'] = s
        context['event'] = s.event
        return context

此视图的URL模式(包含在基urls.py)中:

^{pr2}$

在ModelForm中,我尝试转换EventSessionRegistration字段上的ForeignKey session(指向EventSession)以显示一个HiddenInput()-小部件:

class SessionRegistrationForm(forms.ModelForm):

    class Meta:
        model = EventSessionRegistration
        widgets = {
            'session': HiddenInput()
        }

但我仍然不知道如何将该字段的初始值设置为我在get_context_data中设置的'session'值的id。我尝试过在get_context_data内设置self.initial = {'session': s.id},但我猜此时initial属性已经被用来构造表单了。在

有什么办法能达到这个目的吗?我错过了什么?在


Tags: selfevent视图url表单datagetfoo
1条回答
网友
1楼 · 发布于 2024-10-04 03:29:06

对,我找到了this question,它处理相同的问题。 最后,我在视图中使用了以下重写的post函数,并在模板的隐藏字段中手动输出会话id:

def post(self, request, *args, **kwargs):
    self.object = None
    evt_session = get_object_or_404(
        EventSession, pk=int(self.request.POST['session']))
    form_class = self.get_form_class()
    form = self.get_form(form_class)

    form.instance.session = evt_session

    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

另外,我还发现了ccbv.co.uk,这是一个很好的资源,可以用来了解中的所有方法和属性CBV:s公司,为如何构造覆盖提供了指导。在

相关问题 更多 >