我有一个用户选择车辆牌照的区域,根据这个选择,我希望从车辆表中填写一个表格(查询: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是一个随机字段,仅用于获取用户选择。我认为业主的模型定义并不重要。
答案 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
。