首页 文章

Django将参数传递给CreateView并用它填充表单

提问于
浏览
0

我想创建一个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>

当用户提交此表单时,他将被重定向到另一个页面 . 询问他是否要在DB中插入该值 .

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

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

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

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

更新

CreateView

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

1 回答

  • 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.argsself.request.session

    还有一个注意事项 - 在第一个视图中,最好不要从POST读取变量,而是使用表单 .

相关问题