【问题标题】:Getting a form in Django DetailView在 Django DetailView 中获取表单
【发布时间】:2016-10-24 17:38:01
【问题描述】:

我目前正在尝试显示一个自定义表单,我在相应视图中更改表单

在.html中

<form action="{% url 'systems_system_update' system.id %}" id="system_update_form" method="post" class="form">
        {% csrf_token %}
        {% buttons %}
          <button type="submit" class="btn btn-primary">Update {{ system.name }}</button>
        {% endbuttons %}
        {% bootstrap_form system_update_form %}
        {% buttons %}
          <button type="submit" class="btn btn-primary">Update {{ system.name }}</button>
        {% endbuttons %}
      </form>

所以我试图在视图中定义的地方显示 system_update_form 在 SystemDetailView 中

class SystemDetailView(DetailView):
"""Detail view for Systems"""

form_class = SystemForm
model = System
template_name = 'systems/system_detail.html'

def get_form(self, form_class):
    form = super(SystemDetailView, self).get_form(form_class)
    form.fields['primary_purpose_business_use'].label = "Primary purpose/business use"
    form.fields['secondary_purpose_business_uses'].label = "Secondary purpose/business uses"

    return form

def get_context_data(self, **kwargs):
    context = super(SystemDetailView, self).get_context_data(**kwargs)
    context.update({
        'system_update_form': self.form_class(instance=self.get_object()),
        'object_name': self.object.name,
        'user_can_edit': self.request.user.has_perm(
            'services.change_system'),
        'user_can_delete': self.request.user.has_perm(
            'services.delete_system'),
        'object_events': self.object.events.all(),
    })

    return context

所以,我正在更新上下文并将“system_update_form”设置为表单,并尝试使用 get_form 更新表单,但我认为 DetailView 没有用于覆盖的 get_form 方法。 在表单中更新它不是一种选择,因为 SystemForm 用于许多不同的地方,需要专门针对此视图进行更改

【问题讨论】:

    标签: python django forms django-generic-views detailview


    【解决方案1】:

    DetailView 没有get_form() 方法,因为它不使用表单,因此您的get_form() 方法没有被调用。

    除此之外,您可以在get_form() 方法中手动实例化表单,并在生成context 时调用此方法。

    另外,在您的代码中,您通过调用self.get_object()instance 传递给表单。这将导致另一个获取object 的查询,因为Django 之前已经获取了object。您可以直接使用self.object 传递object,而不是这样做。

    class SystemDetailView(DetailView):
    
        def get_form(self):
            form = self.form_class(instance=self.object) # instantiate the form
    
            # modify the form fields
            form.fields['primary_purpose_business_use'].label = "Primary purpose/business use"
            form.fields['secondary_purpose_business_uses'].label = "Secondary purpose/business uses"
    
            return form
    
        def get_context_data(self, **kwargs):
            context = super(SystemDetailView, self).get_context_data(**kwargs)
            context.update({
                'system_update_form': self.get_form(), # get the form instance
                'object_name': self.object.name,
                'user_can_edit': self.request.user.has_perm(
                    'services.change_system'),
                'user_can_delete': self.request.user.has_perm(
                    'services.delete_system'),
                'object_events': self.object.events.all(),
            })
    
            return context
    

    【讨论】:

    • 哇!太感谢了!这就像一个魅力。非常感谢!
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2017-12-12
    • 2017-10-19
    • 1970-01-01
    • 2015-03-20
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多