таблица данных модели Django; пытается сохранить элементы, выбранные из списка за пределами модели - PullRequest
0 голосов
/ 31 марта 2012

У меня есть следующая модель в проекте:

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)

Я пытаюсь создать страницу с таблицей, в которой пользователь-администратор может редактировать элементы водителя и гонщиков для всех назначений автомобилей в определенной группе. Я не могу использовать набор форм, потому что мне также нужно добавить данные из другой модели, а также потому, что выбор в каждом списке происходит из другого подгруппы гонщиков и гонщиков, принадлежащих к определенной группе. Драйвер - это список выбора, а 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()

Проблема в том, что когда он находит соответствующий тег драйвера, все, что он возвращает, это строка имени и фамилии. Я не могу сделать car_assignment.driver = driver, потому что он пытается приравнять объект драйвера к строке.

Я не уверен, как это сделать. Я думаю, я мог бы разобрать имя и фамилию и попытаться сопоставить их с моделью драйвера, чтобы получить нужные мне объекты драйвера, но это кажется неэффективным и, возможно, подверженным ошибкам.

Любая помощь приветствуется (я программист и новичок в Django). Благодаря.

1 Ответ

1 голос
/ 31 марта 2012

Я не уверен, откуда берется ваше поле 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 Работа с формами . Логика, которую вы пишете в представлении, должна быть перемещена в объект формы. Ваше представление может затем создать экземпляр формы и передать данные поста. Затем форма может быть проверена и будет обрабатывать сохранение ваших новых объектов. Это лучший способ сделать это.

Обновленный поток для вашего представления будет упрощен до чего-то вроде этого:

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 }}
...