由于外键,表单is_valid()失败

时间:2015-08-10 15:32:25

标签: python forms mongodb validation django-nonrel

我不明白为什么我的表格目前无效。每次我提交表单时,如果它无效,我只需重新加载网站即可。我认为我正确地提交了它并且我已经尝试了几种不同的东西来使这个工作,但我现在在智慧结束。我很确定错误在我用来引用我的用户对象的错误键中(我想注册一个设备并将其注册到登录用户)

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))

models.py:

类DeviceForm(ModelForm):

  class Meta:
        model = Device
        fields = ['name', 'agent_id', 'device_type', 'owner']

    def __init__(self, *args, **kwargs):
        self.owner = kwargs.pop('owner', None)
        super(DeviceForm, self).__init__(*args, **kwargs)

    """def clean_agent_id(self):
        agent_id = self.cleaned_data['agent_id']
        if Device.objects.exclude(pk=self.instance.pk).filter(agent_id=agent_id).exists():
            raise forms.ValidationError(u'agent_id "%s" is already in use.' % agent_id)
        return agent_id
        """

    def save(self, commit=True):
        device = super(DeviceForm, self).save(commit=False)
        device.owner = self.owner
        if commit:
            device.save()
        return device

旁注:我已经注释掉了clean_agent_id方法,因为当我尝试使用它来防止设备重复时,我得到了一个"这个查询不支持数据库错误"我使用MongoDB作为我的数据库,所以我不需要进行任何迁移或类似的事情。

1 个答案:

答案 0 :(得分:1)

我想我弄明白为什么没有过世。简单地引用用户名是不够的,所以我必须手动添加用户名(我在Django Forms网站的ModelForm页面上查看了如何执行此操作)。我要做的是1.从模板中的表单中删除所有者字段。 2.从models.py中为“DeviceForm”模型“排除”所有者字段,然后使用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 %}

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)

views.py:

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_valid()没有传递的问题。