django模型数据表;尝试保存从模型外部的列表中选择的项目

时间:2012-03-31 16:23:50

标签: django django-views

我在项目中有以下模型:

class CarAssignment(models.Model):
    leg = models.ForeignKey(Leg, null=True, blank=True)
    driver = models.ForeignKey(Driver, null=True, blank=True)
    riders = models.ManyToManyField(Rider, null=True, blank=True)

我正在尝试创建一个带有表格的页面,其中管理员用户可以编辑特定组中所有汽车作业的驱动程序和骑手项目。我不能使用formset,因为我还需要从另一个模型中添加数据,因为每个列表中的选项来自不同的骑手和驱动程序子集,属于特定组。驱动程序是一个选择列表,Riders是一个多选列表。

我已经成功构建了表示数据的页面和表,并提供了正确工作的下拉列表。但是,我无法弄清楚如何保存这些物品。这是一个特定的问题场景:

对于表中的第1行(表示CarAssignment对象#1),我从选择下拉列表中的列表中选择一个新驱动程序。我在html中分配自定义名称标签以识别它们,如下所示:

<option selected name="select.driver.{{ car_assignment.id }}">{{ driver }}</option>

然后在视图中,我试图查看它是否与任何内容匹配,如下所示:

        for car_assignment in CarAssignment.objects.filter(leg__in=legs):
            driver_tag = "select.driver." + str(car_assignment.id)
            if driver_tag in request.POST:
                car_assignment.driver = driver
                car_assignment.save()

问题在于,当找到匹配的驱动程序标记时,它返回的全部是First Name和Last Name的字符串。我无法执行car_assignment.driver =驱动程序,因为它试图将驱动程序对象等同于字符串。

我不知道该怎么做。我想我可以解析出名字和姓氏,并尝试将它们与Driver模型相匹配,以获得我需要的Driver对象,但这似乎效率低下且可能容易出错。

感谢任何帮助(我是编程和Django新手)。感谢。

1 个答案:

答案 0 :(得分:1)

我不知道你的driver字段来自哪里,但如果它是一个字符串,你可以再做另一个查询来获取驱动程序对象:

for car_assignment in CarAssignment.objects.filter(leg__in=legs):
    driver_tag = "select.driver." + str(car_assignment.id)
    if driver_tag in request.POST:
        # Get the driver object
        driver = Driver.objects.filter(name=driver_name)[0]

        car_assignment.driver = driver
        car_assignment.save()

我还强烈建议您阅读Django教程Working with forms。您在视图中写入的逻辑应该移动到表单对象。然后,您的视图可以实例化表单并传递发布数据。然后可以验证表单并处理保存新对象。这是最好的方法。

您视图的更新流程将简化为以下内容:

def my_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            form.save()

            # Do something here like redirect the user
            # to acknowledge that the form was submitted successfully.
    else:
        form =  MyForm()

    return render_to_response('form.html', {
        'form': form,
    })

通过将表单传递给您的模板,您可以生成表单,只需执行以下操作:

{{ form.as_ul }}