Python 由于外键原因,表单“”无效()
我不明白为什么我的表格现在无效。每次我提交我的表格,如果它是无效的,我只是让网站重新加载。我认为我提交的是正确的,我尝试了几种不同的方法来让它工作,但我现在束手无策。我很确定错误在我用来引用我的用户对象的错误键中(我想注册一个设备并将它注册到一个登录的用户) views.py:Python 由于外键原因,表单“”无效(),python,forms,mongodb,validation,django-nonrel,Python,Forms,Mongodb,Validation,Django Nonrel,我不明白为什么我的表格现在无效。每次我提交我的表格,如果它是无效的,我只是让网站重新加载。我认为我提交的是正确的,我尝试了几种不同的方法来让它工作,但我现在束手无策。我很确定错误在我用来引用我的用户对象的错误键中(我想注册一个设备并将它注册到一个登录的用户) views.py: def devices(request): if request.method == 'POST': devform = DeviceForm(request.POST, owner=reques
def devices(request):
if request.method == 'POST':
devform = DeviceForm(request.POST, owner=request.user)
if devform.is_valid():
dev = devform.save()
dev.save()
return HttpResponseRedirect(reverse('deviceconfirmation', kwargs={'device_id': dev.id}))
else:
return render_to_response('courses/devices.html', {'devform': devform}, context_instance=RequestContext(request))
else:
devform = DeviceForm()
return render_to_response('courses/devices.html', {'devform': devform}, context_instance=RequestContext(request))
def devices(request):
dev_obj = DeviceForm()
if request.method == 'POST':
u = User.objects.get(username=request.META['USER'])
devowner = Device(owner=u)
devform = DeviceForm(request.POST, instance=devowner)
if devform.is_valid():
dev = devform.save()
dev.save()
return HttpResponseRedirect('deviceconfirmation')
else:
return render(request, 'courses/invalidimp.html', {'devform':devform})
else:
return render_to_response('courses/devices.html', {'dev_obj': dev_obj}, context_instance=RequestContext(request))
models.py:
class DeviceForm(ModelForm):
class Meta:
model = Device
exclude = ['owner']
def __init__(self, *args, **kwargs):
self.owner = kwargs.pop('owner', None)
super(DeviceForm, self).__init__(*args, **kwargs)
类DeviceForm(模型形式):
旁注:我已经注释掉了clean_agent_id方法,因为当我尝试使用它来防止设备的重复时,我得到了一个“数据库错误不支持此查询”我使用MongoDB作为我的数据库,所以我不需要进行任何迁移或类似的操作 我想我明白了为什么它没有通过。仅仅引用用户名是不够的,所以我要做的是手动添加用户名(我在Django表单网站的ModelForm页面上查看了如何做到这一点)。我要做的是1。从模板中的“我的表单”中删除“所有者”字段。2. '对于DeviceForm模型和3,从my models.py中排除“所有者”字段。使用views.py上当前登录的用户手动设置所有者 devices.html:
{% extends "layout.html" %}
{% load static from staticfiles %}
{% block title %}{{ page.title }}{% endblock %}
{% block content %}
<article>
<div id="wrapper">
<p id="devicecreate">Register your device to your account:</p>
<form action="{% url 'courses:devices' %}" id="devform" method="post"> {% csrf_token %}
<p>
<label for="name">Device Name:</label>
<input id="name" name="name" type="text">
</p>
<p>
<label for="agent_id">Agent ID:</label>
<input id="agent_id" name="agent_id" type="text">
</p>
<p>
<label for="device_type">Imp Type:</label>
<input id="device_type" name="device_type" type="text">
</p>
<p>
<input type="submit" value="REGISTER DEVICE" id="submit">
</p>
</form>
</div>
</article>
{% endblock %}
views.py:
def devices(request):
if request.method == 'POST':
devform = DeviceForm(request.POST, owner=request.user)
if devform.is_valid():
dev = devform.save()
dev.save()
return HttpResponseRedirect(reverse('deviceconfirmation', kwargs={'device_id': dev.id}))
else:
return render_to_response('courses/devices.html', {'devform': devform}, context_instance=RequestContext(request))
else:
devform = DeviceForm()
return render_to_response('courses/devices.html', {'devform': devform}, context_instance=RequestContext(request))
def devices(request):
dev_obj = DeviceForm()
if request.method == 'POST':
u = User.objects.get(username=request.META['USER'])
devowner = Device(owner=u)
devform = DeviceForm(request.POST, instance=devowner)
if devform.is_valid():
dev = devform.save()
dev.save()
return HttpResponseRedirect('deviceconfirmation')
else:
return render(request, 'courses/invalidimp.html', {'devform':devform})
else:
return render_to_response('courses/devices.html', {'dev_obj': dev_obj}, context_instance=RequestContext(request))
这将使我只通过is_valid()并正确获取所有者模型。我在保存表单时仍有问题,但我认为这充分回答了为什么我的is\u valid()没有通过的问题。您是否可以在此处提及form.errors您是说form.is\u valid()不是真的,那么一定有form.error show我可以看看form.errors是什么吗?抱歉,对于Django来说有点陌生,在这里使用调试器并停止执行流,导入pdb;pdb.set_trace()我查找并找到了一个显示devform.errors的方法,但我能得到的所有信息都是错误:“选择一个有效的选项。该选项不是可用的选项之一。”