该视图...未返回HttpResponse对象。它返回了None

时间:2019-04-02 14:55:56

标签: django httpresponse

我有一个视图,向我抛出以下错误“视图Apps.General.localidades_vistas.Localidad_Crear没有返回HttpResponse对象。而是返回了None。”当我尝试保存新的“ localidad”时...我通过了代码以查看是否可以帮助我。

views.py

class Localidad_List(ListView):
    model = localidades
    template_name = 'general/localidad_list.html'
    def get_queryset(self):
        buscar = self.request.GET.get('buscalo')
        if buscar:
            object_list = localidades.objects.filter(localidad__contains = buscar)
        else:
            object_list = localidades.objects.all()
        return object_list

class Localidad_Crear(CreateView):
    model = localidades
    form_class = LocalidadForm
    template_name = 'general/localidad_form.html'
    success_url = reverse_lazy('general:localidad_listar')

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            modelo = form.save(commit=False)
            modelo.clocalidad = localidad_max() #'99'
            #print(localidad_max())
            usuario = self.request.user
            modelo.usumodi = str(usuario)
            form.save()
            return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('general:localidad_listar')

class Localidad_Edit(UpdateView):
    model = localidades
    form_class = LocalidadForm
    template_name = 'general/localidad_form.html'
    success_url = reverse_lazy('general:localidad_listar')

class Localidad_Delete(DeleteView):
    model = localidades
    template_name = 'general/localidad_delete.html'
    success_url = reverse_lazy('general:localidad_listar')      

def localidad_max():
    try:
        cvalor = localidades.objects.latest('clocalidad').clocalidad
    except:
        cvalor = '0'
    cvalor = str(int(cvalor) + 1)
    return cvalor.zfill(5)

def provincia_load(request):
    cpais = request.GET.get('cpais')
    xprovincias = provincias.objects.filter(cpais = cpais).order_by('provincia')
    return render(request,'general/combo_provincia.html', {'provincias':xprovincias})

urls.py

from .views import from .localidades_vistas import Localidad_List, Localidad_Edit, Localidad_Delete, Localidad_Crear, provincia_load
#, Provincia_Crear, Provincia_Edit, Provincia_Delete

app_name = 'general'

urlpatterns = [
    path('',index, name = 'index'),
    #--------------------- Localidades ---------------------------    
    path('localidades',Localidad_List.as_view(), name = 'localidad_listar'),
    path('localidad_nuevo',Localidad_Crear.as_view(), name = 'localidad_crear'),
    path('localidad_editar/<pk>/',Localidad_Edit.as_view(), name = 'localidad_editar'),
    path('localidad_eliminar/<pk>/',Localidad_Delete.as_view(), name = 'localidad_eliminar'),    
    path('ajax/provincias/', provincia_load, name = 'ajax_provincias'),    
]

forms.py

from django import forms
from .models import paises, provincias, localidades

class LocalidadForm(forms.ModelForm):
    class Meta:
        model = localidades
        # con esto añades un campo de texto que te permite realizar la busqueda, puedes añadir mas de un atributo por el cual se filtrará
        search_fields = ['localidad']

        fields = [
            'localidad',
            'cp',
            'cpais',
            'cprovincia',
            'vigente',
        ]

        labels = {
            'localidad' : 'Localidad',
            'cp' : 'Cod. Postal',
            'cpais' : 'País',
            'cprovincia' : 'Provincia',
            'vigente' : 'Vigente',
        }
        widget= {
            'localidad' :forms.TextInput(attrs = {'class':'form-control'}),
            'cp' :forms.TextInput(attrs = {'class':'form-control'}),
            'cpais' :forms.Select(attrs = {'class':'form-control'}),
    }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['cprovincia'].queryset = provincias.objects.none()
        if 'cpais' in self.data:
            try:
                cpais = int(self.data.get('cpais'))
                self.fields['cprovincia'].queryset = provincias.objects.filter(cpais = cpais).order_by('provincia')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['cprovincia'].queryset = self.instance.cpais.provincias_set.order_by('provincia')

localidad_form.html

{% extends 'base/base.html' %}

{% block content %}
<div class="container">
    <form method="post" id="Localidad_Form" data-provincias-url="{% url 'general:ajax_provincias' %}" novalidate >
        {% csrf_token %}
        {{ form.as_p}}
        <button class="btn btn-primary btn-sm" type= "submit">Guardar</button>
    </form>

    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script>
    $(document).ready(function(){
        $("#id_cpais").change(function () {
            var url = $("#Localidad_Form").attr("data-provincias-url");  
            var paisId = $(this).val();  
            $.ajax({                       
            data: {
                'cpais': paisId      
                },
            success: function (data) {  
                $("#id_cprovincia").html(data);  
            }
            }); 
        });
    });
    </script>
</div>
{% endblock %}
{% block filtros %}
    <td>
        <a class="btn btn-success btn-sm" href="{% url 'general:provincia_crear' %}">Agregar Provincia</a>
        <a class="btn btn-success btn-sm" href="{% url 'general:pais_crear' %}">Agregar País</a>
    </td>
{% endblock %}

combo_provincia.html

<option value="">---------</option>
{% for provincia in provincias %}
<option value="{{ provincia.cprovincia }}">{{ provincia.provincia }}</option>
{% endfor %}

谢谢。

PD:我有几个下拉列表可以很好地工作,这是另一个查询的主题。 :-)

2 个答案:

答案 0 :(得分:0)

您遇到了这个问题,因为如果请求类型不是POST,您就没有编写HttpResponse对象

要在您的视图中解决此问题,请写一些东西,如果请求类型不是post,它将处理

    form = SearchForm()
    if request.method == "POST":
        f = SearchForm(request.POST)
        if f.is_valid():
            Pets = Pet.objects.filter(animal = f.cleaned_data["text"])
            return HttpResponseRedirect("search.html",{"Pets":Pets},{"form":form})

答案 1 :(得分:0)

如果form.is_valid为假,则您的post函数缺少返回值。您需要添加else部分。

def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.form_class(request.POST)
        if form.is_valid():
            modelo = form.save(commit=False)
            modelo.clocalidad = localidad_max() #'99'
            #print(localidad_max())
            usuario = self.request.user
            modelo.usumodi = str(usuario)
            form.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.form_invalid(form)

您可以将is_valid块中的逻辑移至form_valid方法,而不必覆盖post。您可以轻松检查here方法的默认代码。