0

我有一个字段,用户可以在其中选择车辆的车牌,根据这个选择,我希望从车辆表(查询:)中填充一个表单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 是一个随机字段,仅用于获取用户的选择。我认为所有者模型定义并不重要。

4

2 回答 2

0

我不明白的东西:

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

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

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

a) 用户通过vehicles_archive视图从列表中进行选择。此视图仅处理 GET 请求,因为它仅用于显示此用户拥有的车辆。这个视图的 url 就像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按钮。它不是一种形式。您的 vehicle_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) 用 Ja​​vascript 和 AJAX 做所有这些事情。虽然我很难在这里展示一个例子,因为它会很长而且超出你原来问题的范围。

2) 使用 django 的表单向导工具。

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

于 2012-09-05T13:28:58.790 回答
0

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

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

要与 进行比较own_id1,您需要传递一个User实例,而不是整数。如果您想通过 id 查找它,那么您需要执行以下操作:

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

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

于 2012-09-05T14:35:34.363 回答