【问题标题】:How to Receive dictionary in post data passed in Django Template如何在 Django 模板中传递的帖子数据中接收字典
【发布时间】:2020-05-21 16:05:32
【问题描述】:

下面是我的模型:

class Person(models.Model):
    number = models.ForeignKey(Admfiles, on_delete=models.CASCADE,  blank = False)
    name = models.CharField(max_length = 255,  blank = False)
    situation= models.CharField(max_length = 20, blank = False)

在我的模板中,输入是使用js追加输入动态创建的,所以我不知道字典的长度。

<input name="person[0][name]"      value="...">
<input name="person[0][situation]" value="...">
<input name="person[1][name]"      value="...">
<input name="person[1][situation]" value="...">
<input name="person[n][name]"      value="...">
<input name="person[n][situation]" value="...">

如果这样做,我会收到正确的值:

return HttpResponse(request.POST.get('person[0][name]'))
return HttpResponse(request.POST.get('person[0][situation]'))

如何迭代以将 n 个元素保存到我的模型中?

【问题讨论】:

  • @Winston 你能帮我解决我的问题吗?我一直在寻找答案几个小时没有结果。
  • 嗨@Marce Laco,你的问题有点含糊。如果您可以添加更多详细信息、添加您的观点或输入示例,我们可能会为您提供帮助。
  • @Winston,对不起,我是 Django 的新手。现在这更容易理解了吗?
  • 你的问题解决了吗?
  • 不,很遗憾。我使用:def post(self,request,*args,**kwargs): form = self.form_class(request.POST) if form.is_valid(): data = request.POST.dict() for key in data: value = data[key] 错误消息是:CreatePerson 没有返回 HttpResponse 对象。它返回 None 。

标签: django list dictionary multidimensional-array request


【解决方案1】:

如果我正确理解了您的问题,您可以获取整个 POST 数据,如下所示:

data = request.POST.dict()

然后你可以遍历这个字典并保存对象。

for key in data:
   value = data['key']
   # save the element in your database

【讨论】:

    【解决方案2】:

    [在此处输入图片描述][1]

    我终于使用了表单集库。 (pip install... 作为第一步)

    设置.py:

    INSTALLED_APPS = [
        'djangoformsetjs',
    ]
    
    

    我的表格:

    from django.forms import inlineformset_factory
    
    class CrearImputadoForm(forms.ModelForm):
        class Meta:
            model = Imputado
            fields = '__all__'
    
    ImputadoFormset = inlineformset_factory(
        Expediente,
        Imputado,
        extra=1
    )
    

    我的看法:

    class CrearImputado(CreateView):
        model = Imputado
        form_class = CrearImputadoForm
        template_name = 'crear_imputado.html'
    
        def get_context_data(self,**kwargs):
            context = super().get_context_data(**kwargs)
            context['formset'] = ImputadoFormset(queryset=Imputado.objects.none())
            context['expedientes'] = Expediente.objects.filter(id = self.kwargs['pk'])
            return context
    
        def post (self, request, * args, ** kwargs):
            #return HttpResponse(request.POST.items())
            expediente = Expediente.objects.get(pk=request.POST.get('numero_id'))
            form = ImputadoFormset(request.POST, instance=expediente)
            if form.is_valid():
                #return HttpResponse(request.POST.items())
                form.save()
                return redirect('repositorio:crear_delito', request.POST.get('numero_id'))
            else:
                #return HttpResponse(request.POST.items())
                return render(request, self.template_name, {'form': form, 'mensaje':'Ocurrió un error. Contáctese con el administrador.'})
    
    

    模板:

                <table class="table table-striped">
                    {{ formset.management_form }}
                    {% for form in formset %}
                        {% if forloop.first %}
                            <thead>
                            <tr>
                                {% for field in form.visible_fields %}
                                    <th>{{ field.label|capfirst }}</th>
                                {% endfor %}
                            </tr>
                            </thead>
                        {% endif %}
                        <tr class="{% cycle row1 row2 %} formset_row">
                            {% for field in form.visible_fields %}
                                <td>
                                    {# Include the hidden fields in the form #}
                                    {% if forloop.first %}
                                        {% for hidden in form.hidden_fields %}
                                            {{ hidden }}                                            
                                        {% endfor %}
                                    {% endif %}
                                    {{ field.errors.as_ul }}
                                    {{ field }}
                                </td>
                            {% endfor %}
                        </tr>
                    {% endfor %}
                </table> 
    
    
    <script type="text/javascript">
        $('.formset_row').formset({
            addText: 'Nuevo Imputado',
            deleteText: 'Borrar',
            prefix: 'imputado_set'
        });
    </script>
    
    
    And finally import jquery.formset.js.
    
    I don't know if it's the best way, but works fine.
    
    
      [1]: https://i.stack.imgur.com/CRPaZ.png
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 2021-09-08
      • 1970-01-01
      • 2023-03-11
      • 2016-11-25
      • 2011-12-22
      相关资源
      最近更新 更多