Django Modelforms:匹配的查询不存在并发布数据

Django Modelforms:匹配的查询不存在并发布数据,django,Django,我有一个字段,用户在其中选择车辆牌照,根据此选择,我希望从车辆表中填充表单(查询:vehicle=vehicles.objects.get(plate=plate))。 我用这样的观点来管理它: def vehicles_archive(request): user = request.user user_id = user.id u_id = user_id vehicles = Vehicles.objects.filter(own_id1 = u_id)

我有一个字段,用户在其中选择车辆牌照,根据此选择,我希望从车辆表中填充表单(查询:
vehicle=vehicles.objects.get(plate=plate)
)。 我用这样的观点来管理它:

def vehicles_archive(request):
    user = request.user
    user_id = user.id 
    u_id = user_id

    vehicles = Vehicles.objects.filter(own_id1 = u_id)
    if request.method == 'POST':
        plate = request.POST.get('searchPlate')
        vehicle = Vehicles.objects.get(plate=plate)

        form = VehiclesForm(data=request.POST, instance=vehicle, own_id=u_id)
        if form.is_valid():
            form.save()
            return render_to_response('success.html', locals(), context_instance= RequestContext(request))
        else:
            vehicles = Vehicles.objects.filter(own_id1 = u_id)
            vehicle = Vehicles.objects.get(plate=plate)
            form = VehiclesForm(instance=vehicle, own_id=u_id)

    return render_to_response('vehiclesArchive.html', locals(), context_instance= RequestContext(request))
一切似乎都很好,但当我编辑表单字段并尝试提交表单时,我得到: 车辆匹配查询不存在。 并用车牌表示查询。 我使用的逻辑一定有错误,但我如何解决它?或者有更好的方法实现上述功能吗

编辑:


而searchPlate是一个随机字段,仅用于获取用户选择。我认为车主模型的定义并不重要。

我不明白的是:

我有一个用户选择车辆牌照的字段

这在哪里发生?在您发布的视图代码中

因为这看起来是一个两步的过程,而不是一步

a) 用户通过
vehicles\u archive
视图从列表中进行选择。这一观点 仅处理GET请求,因为它仅用于显示车辆 此用户拥有。此视图的url类似于
r'^vehicles/$”
。 并且该列表将是一组条目,每个条目包括到相应车辆的链接。e、 g.
/vehicles/YKH4034/
。因此,我们需要在url.py中使用另一个url正则表达式 比如
r'^vehicles/(?P\w{80})/$”
。以及处理此url的不同视图。 例如命名为
车辆\u存档\u详细信息

b) 用户选择了要编辑的车辆,现在由
车辆存档\u详细信息
提供服务。此视图处理GET和POST请求。
获取以显示特定车辆的表单,并在何时发布
车主实际修改(提交表格)车辆

不过,我在您的代码中没有看到这种逻辑。也许我不明白 你的问题很好

更新:

您不需要GET参数(searchPlate),也不需要
search
按钮。事实并非如此 表格。您的车辆档案视图将有一个类似于以下内容的模板:

{% extends 'somebaseview.html' %}

{% block content %}
    <ul>
    {% for vehicle in owner_vehicles %}
        <a href="/vehicles/{{ vehicle.plate }}/"> {{ vehicle.plate }} </a>
    {% endfor %}
    </ul>
{% endblock %}
{%extends'somebaseview.html%}
{%block content%}
    {owner_vehicles%%中车辆的百分比} {%endfor%}
{%endblock%}
因此,用户只需单击一个链接,即可将其带到特定位置 他想编辑的车辆

更新2:

你说你需要一个下拉菜单和一个搜索按钮。但是我没有看到搜索结果 功能。是否有可能找不到该表格?有 当他“命中”时,可能会有多个结果(车辆) 搜索

无论如何,如果那是你真正需要的。我看到两种方式:

1) 使用Javascript和AJAX完成所有这些工作。虽然这对我来说很难 在这里显示一个示例,因为它会很长,而且不完整 你原来问题的范围

2) 使用django的工具

在任何情况下,您都可以首先确保第二步(用户查看/编辑特定车辆)正常工作,然后决定如何从步骤1过渡到步骤2。即
Ajax或表单向导。

问题在于,您是通过外键的id而不是对象本身来查找外键的。例如:

vehicles = Vehicles.objects.filter(own_id1 = u_id) 
要与
own_id1
进行比较,您需要传递一个
User
实例,而不是一个整数。如果要通过id查找,则需要执行以下操作:

vehicles = Vehicles.objects.filter(own_id1_id = u_id)

这也说明了为什么不应该在外键的名称中使用
\u id
。在数据库级别,Django自动附加
\u id

什么是模板?POST数据中是否有
searchPlate
?如果
控制流逻辑没有意义,请删除
。您可以检查
if request.method==POST
,尽管您已经在上面的6行中完成了检查。此外,您还有很多代码冗余。你能添加关于车辆和车主的完整车型定义吗?是的,我能感觉到问题在于两篇文章(其中一篇文章的情况相同)。我尝试重定向到另一个模板,模板为args,并在该模板中呈现表单,但使用该解决方案,用户无法在第一次选择模板后更改模板。我还能试什么?你需要做的很简单。如果您发布模型定义,则更容易为您提供解决方案。此外,在车辆窗体上,您经过kwarg
own\u id
。您的表单是否知道此参数?@marlen,在这种情况下,您对
vehicle
的查询将按预期失败。你需要查询车牌
searchPlate
似乎合法的车辆,我喜欢。但是当我尝试时,我选择了一个板块,点击搜索,url变成:../vehiclesArchive/?searchPlate=KY123,但是没有调用查看车辆\u archive\u详细信息(我还尝试了简单的打印)。怎么了?@marlen 1)我忘了在我提供的第一个正则表达式中添加
$
。2) 请参阅更新的答案。我注意到$。是的,好的,它可以与链接一起工作,但是我需要(请求)一个带有图版的下拉列表,用户可以从中选择一个,通过点击搜索,相应的表单将被呈现..jquery和ajax是一个解决方案,我知道,我只是试图避免它,尽管我使用过它。我将检查此表单向导工具,因为我不知道它。感谢您的时间和总体帮助!:)@马伦很高兴我帮了忙。同时检查Chris Pratt的观察结果。除非您处理的是无法控制的遗留数据库,否则您应该遵循这些规则。实际上,它也适用于整数。但是关于假身份证,我看不出你的答案和我的问题有什么关系。关于ids的错误做法,您可能是对的(但这是一个遗留数据库),但有问题的查询是带有图版的查询,并且查询本身是成功的,问题在于我在视图中使用的两种形式的整个逻辑。但我现在有点改变了。
vehicles = Vehicles.objects.filter(own_id1_id = u_id)