【问题标题】:Django passing parameter to CreateView and filling the form with itDjango 将参数传递给 CreateView 并用它填充表单
【发布时间】:2018-04-03 04:34:25
【问题描述】:

我想创建一个 CreateView,表单已经完成,并带有一个将从另一个视图传递给它的参数。

有一个带有输入字段的初始视图。像这样:

<form role="form" action="" method="post">
    {% csrf_token %}
    <div class="col-sm-6">
      <div class="form-group">
        <div class="form-line">
          <label>{{form.cpf.label}}</label><strong style="color:red;"> *</strong>
          {% if form.cpf.errors %}<label class="error">{% for error in form.cpf.errors %}{{error}}{% endfor %}</label>{% endif %}
          {{form.cpf}}
        </div>
      </div>
    </div>
    <button class="btn btn-success foot-btn" type="submit"><i style="vertical-align:middle" class="material-icons">add</i><span style="vertical-align:middle">Verificar</span></button>
</form>

当用户提交此表单时,他将被重定向到另一个页面。询问他是否想将该值插入数据库中。

现在我正在尝试像这样重定向,尝试将 POST 值作为参数传递给 CreateView

return redirect(reverse('blacklist:addcpfview', args=(request.POST['cpf'],)))

但我似乎无法在 CreateView 中获取此参数。

我知道我目前的做法可能非常错误,但我是 Django 的初学者,想知道最好的方法。

更新

创建视图

class AdicionarCPFView(CreateView):
    form_class = CPFForm
    template_name = 'blacklist/cpf/addCPF.html'
    success_url = reverse_lazy('blacklist:cpfselectview')

    def get_context_data(self, **kwargs):
        context = super(CreateView, self).get_context_data(**kwargs)
        context['title_complete'] = 'Adicionar CPF'
        return context

【问题讨论】:

  • 试试def get_context_data(self, *args, **kwargs),你的参数在*args列表中。更好的是,改用kwargs 并为您的参数命名。

标签: python django


【解决方案1】:

当你使用CreateView - 它有一个特殊的方法来填充初始值 - get_initial

你需要重写这个方法并从kwargs那里读取变量。

def get_initial(self):
    initial = super().get_initial()
    # cpf - it's the name of the field on your current form
    # self.args will be filled from URL. I'd suggest to use named parameters
    # so you can access e.g. self.kwargs['cpf_initial']
    initial['cpf'] = self.args[0] 
    return initial

实现此目的的另一种方法是使用会话。

所以当你重定向之前你做request.session['initial_cpf'] = request.POST['cpf]
在创建视图中,您访问的不是self.args,而是self.request.session

附带说明 - 乍一看,最好不要从 POST 中读取变量,而是使用表单。

【讨论】:

  • 发生此错误:get_initial() 采用 1 个位置参数,但给出了 2 个
  • 尝试不使用self,我想我在使用super 时犯了一个错误。我更新了我的代码 sn-p
  • 它似乎在工作。非常感谢!只是一个问题,这是正确的方法吗?还是有更好的方法来完成相同的逻辑?
  • 使用当前方法,我宁愿使用会话或 GET 参数,而不是 URL。此外,还有一个工具可以运行一组表单 - django-formtools.readthedocs.io/en/latest/wizard.html 也许它会满足您的需求。有了它,您可以按步骤显示字段,并在拥有所有数据时使用done方法。
  • 老兄,您发布的链接是圣杯。我一直在 djangoprojects 网站上寻找该资源,但找不到完整的 API 页面,其中列出了每种通用视图类型可以覆盖的所有功能
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 2020-03-26
  • 2020-04-13
  • 2013-01-17
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多