我有一个视图,向我抛出以下错误“视图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:我有几个下拉列表可以很好地工作,这是另一个查询的主题。 :-)
答案 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方法的默认代码。