【问题标题】:form is_valid() failing due to Foreign Key由于外键,表单 is_valid() 失败
【发布时间】:2015-08-10 15:32:25
【问题描述】:

我不明白为什么我的表单现在无效。每次我提交表单时,如果它无效,我只需重新加载网站。我认为我正确地提交了它,并且我尝试了几种不同的方法来使它正常工作,但我现在束手无策。我很确定错误出现在我用来引用我的用户对象的错误键中(我想注册一个设备并将其注册给登录用户)

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 作为我的数据库,所以我不需要进行任何迁移或类似的事情。

【问题讨论】:

  • 您能在此处提及 form.errors
  • 你是说form.is_valid()不成立,那肯定有form.errors
  • 如何查看 form.errors 是什么?抱歉,这里对 Django 有点陌生
  • 使用调试器并停止执行流程,导入pdb; pdb.set_trace()
  • 我查看并找到了一种显示 devform.errors 的方法,但我能得到的所有信息都是错误:“选择一个有效的选择。该选择不是可用的选择之一。”跨度>

标签: python forms mongodb validation django-nonrel


【解决方案1】:

我想我知道为什么它没有通过。仅仅引用用户名是不够的,所以我必须手动添加用户名(我查看了 Django Forms 网站的 ModelForm 页面以了解如何执行此操作)。我要做的是 1. 从模板中的表单中删除 Owner 字段。 2.从我的models.py中为DeviceForm模型“排除”所有者字段和3.使用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() 没有通过的问题。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多