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

时间:2012-09-05 12:10:19

标签: 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)
    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))

所有似乎都运行正常,但是当我编辑表单字段并尝试提交表单时,我得到: 匹配查询的车辆不存在。 它表示带盘子的查询。 我使用的逻辑一定有错误,但我该如何解决呢?或者是否有更好的方法来实现上述功能?

编辑:

class Vehicles(models.Model):
    id = models.DecimalField(primary_key=True, unique=True, max_digits=127, decimal_places=0)
    plate = models.CharField(max_length=80, unique=True)
    tempflag = models.BooleanField()
    vht_id = models.ForeignKey('Vehtypes', null=True, db_column='vht_id',  blank=True)
    vlength = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vwidth = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vheight = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vnetweight = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vmaxload = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    axleno = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    chassis = models.CharField(max_length=160, blank=True)
    man_id = models.ForeignKey('Manufacturers', null=True, blank=True, db_column='man_id')
    own_id1 = models.ForeignKey('Owners', null=True, db_column='own_id1', related_name='veh_own_id1', blank=True)
    own_id2 = models.ForeignKey('Owners', null=True, db_column='own_id2',related_name='veh_own_id2', blank=True)
    ins_id = models.ForeignKey('Insurancecompanies', null=True, blank=True, db_column='ins_id')
    modelno = models.CharField(max_length=160, blank=True)
    checkflag = models.BooleanField()

    def __unicode__(self):
        return self.plate 

    class Meta:
        db_table = u'vehicles'
        ordering = ['plate']

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

2 个答案:

答案 0 :(得分:0)

我不理解的东西:

  

我有一个用户选择车辆牌照的区域

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

因为这似乎是一个两步过程,而不是一个。

a)用户通过vehicles_archive视图从列表中选择。这个观点 只处理GET请求,因为它只用于显示车辆 这个用户拥有。此视图的网址与r'^vehicles/$'类似。 并且列表将是一组条目,每个条目包括到相应车辆的链接。例如/vehicles/YKH4034/。所以我们在urls.py中需要另一个url正则表达式 比如r'^vehicles/(?P<plate>\w{80})/$'。以及处理此URL的不同视图。 以例如vehicles_archive_detail命名。

b)用户选择了他想要编辑的车辆,现在由vehicles_archive_detail提供服务。此视图处理GET和POST请求。 GET用于显示特定车辆的表格和POST时间 车主实际上修改(提交表格)车辆。

我的代码中没有看到这种逻辑。或许我不明白 你的问题很好。

更新:

您不需要GET参数(searchPlate)也不需要search按钮。它不是 表单。您的vehicles_archive视图将包含类似于以下内容的模板:

{% extends 'somebaseview.html' %}

{% block content %}
    <ul>
    {% for vehicle in owner_vehicles %}
        <a href="/vehicles/{{ vehicle.plate }}/"> {{ vehicle.plate }} </a>
    {% endfor %}
    </ul>
{% endblock %}

因此,用户只需点击一个链接即可将他带到具体位置 他想编辑的车辆。

更新2:

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

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

1)用Javascript和AJAX做所有这些事情。虽然对我来说很难 在这里显示一个例子,因为它将是相当冗长的 你原来问题的范围。

2)使用django的form wizard工具。

在任何情况下,您都可以首先确保第二步(用户看到/编辑特定车辆)有效,然后决定如何从第1步转换到第2步。 Ajax或表单向导。

答案 1 :(得分:0)

问题是你正在通过它的id而不是对象本身查找外键。例如:

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

要与own_id1进行比较,您需要传递User实例,而不是整数。如果你想通过id查找它,那么你需要这样做:

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

这也说明了为什么不应该在其名称中使用_id in来命名外键。在数据库级别,Django会自动附加_id