Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python view management.views.home未返回HttpResponse对象。它没有返回任何结果_Python_Django_Django Forms - Fatal编程技术网

Python view management.views.home未返回HttpResponse对象。它没有返回任何结果

Python view management.views.home未返回HttpResponse对象。它没有返回任何结果,python,django,django-forms,Python,Django,Django Forms,我在尝试提交django表单时不断出现此错误。我是django的新手,这个错误让我被困了好几天 这是我的模特 class Person(models.Model): name = models.OneToOneField(User, on_delete=models.CASCADE, unique=True) choices = ( ('Staff', 'staff'), ('Building Manager', 'BM'), )

我在尝试提交django表单时不断出现此错误。我是django的新手,这个错误让我被困了好几天

这是我的模特

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)
url.py

urlpatterns = [
    path('', views.home, name='home'),
    path('ajax/load-devices/', views.load_device, name='ajax_load_device')
    ]
views.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})
forms.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')
home.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函数定义,并在顶部导入

-然后接下来,我将在定义票证表单时删除or None,如下所示

-我猜想您的表单没有进行验证,这不是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'})

如果您的请求是POST,但form.is_valid返回false,那么您将退出所有内容,函数将隐式返回None


我打赌如果你超过最后一次返回的渲染。。。您将得到您想要的。

在views.py文件中,是否有所有的导入,例如从django.shortcuts导入渲染?因为否则您将无法使用渲染功能。是的,我有我怀疑的所有导入,因此下一步将查看发送到主视图的post有效负载/数据。这必须与票证表单和您在init函数中设置的验证保持一致。最好的方法是通过单步执行代码来发现它,并了解为什么表单不使用打印语句或断点进行验证。感谢您的支持/正确答案,因为我刚刚开始讨论堆栈溢出问题;