python - 在 Django DetailView 中获取表单

标签 python django forms django-generic-views detailview

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

在 .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 在 View 中定义的位置 在系统详细 View 中

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 在许多不同的地方使用,并且需要专门针对此 View 进行更改

最佳答案

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

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

此外,在您的代码中,您通过调用 self.get_object()instance 传递给表单。这将导致另一个获取对象的查询,因为Django之前已经获取了对象。您可以使用 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

关于python - 在 Django DetailView 中获取表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973779/

相关文章:

django - 如何在django中将文件流式传输到客户端

django - Django 中的上下文是什么?

forms - 是否可以使用 scaldi 依赖注入(inject)注入(inject) scala 对象?

Javascript将表单序列化为对象

python - 配置向上和向下箭头以在 Python shell 中滚动历史记录

python - 在 python 中以正确格式输出 XML

python list - 转换为列表列表

python - 如何修复tiktok selenium机器人检测

python - 使用身份验证时不存在用户匹配查询

javascript - 在提交之前验证表单