Django表单未保存

时间:2019-07-10 18:48:21

标签: python forms django

我对django来说还比较陌生,我正在尝试实现一些模型形式。

我的页面包含两个视图,一个“政治”部分和一个“体育”部分,每个视图具有用于发表评论的相同表单(我的评论模型称为Comentario)。它具有用于内容的字段和用于注释所属部分的字段。两种观点基本相同,因此我将仅展示政治观点:

from django.contrib import messages
from django.shortcuts import render
from django.views.generic import CreateView

from usuarios.models import Usuario

from .forms import CrearComentario
from .models import Comentario

usuarios = Usuario.objects.all()
comentarios = Comentario.objects.all()
pag = ''

def politics(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
            form = CrearComentario(request.POST, instance=request.user)
            if form.is_valid():
                messages.success(request, 'Publicado!')
                pag = 'politics'
                form.save()
                form = CrearComentario()
        else:
            form = CrearComentario(request.POST,instance=request.user)
    else:
        messages.warning(request, 'Comentario no válido')
        form = CrearComentario(request.POST)
    return render(request, 'main/politics.html', {'usuarios': usuarios,
                                                'comentarios': comentarios,
                                                'form': form})

如果您想知道,“ pag”是一个控制变量,我的signals.py文件会对其进行检查以更新“ pagina”字段

我在自定义modelsforms中遇到了提交按钮,该表单显示正确,当我在该表单中编写内容并提交时,它显示成功消息,但该注释未出现在注释部分中,并且也不会出现在django shell中。

politics.html

{% extends 'main/base.html' %}
{% load static %}
{% load crispy_forms_tags %}
<!-- Here would be the content-->
{% block comentarios %}
    <h3>Comentarios</h3>
    <ul class="a">
  {% for comment in comentarios %}
    {% if comment.pagina == 'politics' %}
        <li>
            <span>{{ comment.contenido }}</span>
            <br>
            <small>{{ comment.usuario }} , {{ comment.fecha }}</small>
            <hr>
            <br>
         </li>
    {% endif %}
  {% endfor %}
        </ul>
  {% if user.is_authenticated %}
        <form method="POST" enctype="multipart/form-data" action="http://localhost:8000/main/politics/">
          {% csrf_token %}
          <fieldset class="form-group">
              <legend>Dejanos tu opinion</legend>
                  {{ form|crispy }}
          </fieldset>
          <div class="form-group">
              <button class="btn btn-outline-info" type="submit">OK</button>
          </div>
      </form>
  {% else %}
   <legend>Inicia sesión para poner comentarios</legend>
  {% endif %} 

{% endblock %}

我的forms.py看起来像这样:

from django import forms
from .models import Comentario

class CrearComentario(forms.ModelForm):
    contenido = forms.CharField(max_length = 250, required=False, widget=forms.Textarea)
    pagina = forms.CharField(max_length = 250, required=False, widget=forms.HiddenInput())

    class Meta:
        model = Comentario
        fields = ['contenido', 'pagina']

用于确定注释所属部分(“ pagina”)的字段已隐藏,因为它是由我的signal.py文件设置的:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import Comentario
from .views import pag
from .forms import CrearComentario


@receiver(pre_save, sender=Comentario)
def fijar_pagina(sender, instance, **kwargs)
    if pag:
        instance.pagina = pag
        pag = ''
        instance.save(update_fields['pagina'])

我没有收到任何错误消息,并且除了未保存评论以外,其他所有行为都应该像

我也尝试了commit == False的保存而不是信号的保存,但是效果不佳:

def politics(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
            form = CrearComentario(request.POST, instance=request.user)
            if form.is_valid():
                messages.success(request, 'Publicado!')
                pag = 'politics'
                comentario = form.save(commit=False)
                comentario.pagina = 'sonsol'
                comentario.save()
                form = CrearComentario()
        else:
            form = CrearComentario(request.POST,instance=request.user)
    else:
        messages.warning(request, 'Comentario no válido)
        form = CrearComentario(request.POST)
    return render(request, 'main/politics.html', {'usuarios': usuarios,
                                                'comentarios': comentarios,
                                                'form': form})

1 个答案:

答案 0 :(得分:1)

if (!self.checkIsAnimOverridden()) { self.view.snapshot() } self.animation(vc1: vc1, vc2: vc2, container: container, duration: self.getDuration()) usuarios都在模块(文件)级别定义。因此,它们将在过程的整个生命周期内都不会更新。

您应该将它们都移到视图主体中,以便对每个请求都运行查询

comentarios