python - 视图 management.views.home 没有返回 HttpResponse 对象。它返回 None 而不是
问题描述
尝试提交我的 django 表单时,我不断收到此错误。我对 django 很陌生,这个错误让我困了好几天。
这是我的model.py
class Person(models.Model):
name = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
choices = (
('Staff', 'staff'),
('Building Manager', 'BM'),
)
type = models.CharField(max_length=30, choices=choices)
def __str__(self):
return '{0} {1} {2}'.format(self.pk, self.name.first_name, self.name.last_name)
class Building(models.Model):
address = models.CharField(max_length=100)
person = models.ForeignKey(Person, on_delete=models.SET_NULL, null=True, blank=True)
def __str__(self):
return self.address
class Device(models.Model):
name = models.CharField(max_length=30)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
total = models.IntegerField()
building = models.ForeignKey(Building, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name
class Ticket(models.Model):
name = models.ForeignKey(Person, on_delete=models.CASCADE)
issue = models.CharField(max_length=255)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
device = models.ForeignKey(Device, on_delete=models.CASCADE)
room = models.CharField(max_length=255)
网址.py
urlpatterns = [
path('', views.home, name='home'),
path('ajax/load-devices/', views.load_device, name='ajax_load_device')
]
视图.py
def home(request, cls=TicketForm):
items = Building.objects.all()
if request.method == "POST":
form = cls(request.POST or None)
if form.is_valid():
form.save()
return redirect(reverse('home'))
else:
form = cls()
return render(request, 'home.html', {'form': form, 'items': items, 'header': 'Building'})
def load_device(request):
category_id = request.GET.get('category')
devices = Device.objects.filter(category_id=category_id).order_by('name')
return render(request, 'device_dropdown.html', {'devices': devices})
表格.py
class TicketForm(forms.ModelForm):
class Meta:
model = Ticket
fields = ['name', 'issue', 'category', 'device', 'room']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['device'].queryset = Device.objects.none()
if 'country' in self.data:
try:
category_id = int(self.data.get('category'))
self.fields['device'].queryset = Device.objects.filter(category_id=category_id).order_by('name')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty Device queryset
elif self.instance.pk:
self.fields['device'].queryset = self.instance.category.device_set.order_by('name')
主页.html
<form class="forms-sample" action="" id="TicketForm" method="post" data-device-url="{% url 'ajax_load_device' %}">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="id_{{ field.name }}">{{ field.label }}</label>
<div>{{ field }}</div>
</div>
{% endfor %}
<button type="submit" value="Submit" class="btn btn-success mr-2">Send</button>
</form>
然后我尝试将views.py中的return语句移出else并且表单没有保存。请我已经为此奋斗了很长时间,如果有人提供帮助,我将不胜感激。谢谢
解决方案
-我会将 cls 参数移出 views.py 中的 home 函数定义并在顶部导入
- 然后接下来我会从定义票证表格中删除或无
- 我想你的表单没有验证,这不是在 else 语句中处理的,导致你的视图不返回响应对象
见下文:
from .forms import TicketForm
def home(request):
items = Building.objects.all()
if request.method == "POST":
form = TicketForm(request.POST)
if form.is_valid():
form.save()
return redirect(reverse('home'))
else:
return HttpResponse("Form Failed to Validate")
else:
form = cls()
return render(request, 'home.html', {'form': form, 'items': items, 'header': 'Building'})
推荐阅读
- spring-boot - JDBC(T4SQLMX) 驱动程序未实现 JDBC DatabaseMetaData 方法
- c - 指向 C 中堆栈数据结构的 Structs 实现的指针
- javascript - 带复选框的图像显示
- c# - DataWriter.DetachStream() 抛出“System.Runtime.InteropServices.COMException”
- javascript - 为什么 html 路由在 express.js 中不起作用?
- ios - TableView 加载数据不正确
- yaml - 使用多行字符串读取和写回 yaml 文件
- django - 使用 SMTP 和 Gmail 在 Django 上发送电子邮件
- r - 如何根据标题抓取具有不同 URL 的多个页面的网页数据?
- sql - SQL:分组、计数和平均