выберите объект для редактирования - PullRequest
0 голосов
/ 22 декабря 2009

У меня есть простая функция просмотра, которая разработана, чтобы позволить пользователю выбирать из элементов, перечисленных в таблице HTML (записи). Нажатие на запись должно отвлечь пользователя от шаблона, из которого он может редактировать эту конкретную запись. Код выглядит следующим образом:

def edit_record(request):
        if request.method == 'POST':
                a=ProjectRecord.objects.get()
                form = RecordForm(request.POST, instance=a)
                if form.is_valid():
                        form.save()
                        return HttpResponseRedirect('/')
        else:
                a=ProjectRecord.objects.get()
                form = RecordForm(instance=a)
        return render_to_response('productionModulewire.html', {'form': form})

Проблема в том, что функция работает отлично, ТОЛЬКО при условии, что в базе данных есть только 1 запись. Как только я добавляю другой, я получаю ошибку множественного возвращенного элемента. Я подозреваю, что это как-то связано с "objects.get ()", но я не знаю, как правильно структурировать представление?

URL-адрес прост (возможно, слишком много):

(r'^edit/', edit_record),

и модель выглядит так:

class ProjectRecord(models.Model): 
    client = models.CharField(max_length=50, choices=CLIENT_CHOICES)
    account = models.CharField(max_length=50, choices=ACCOUNT_CHOICES)
    project_type = models.CharField(max_length=50, choices=TYPE_CHOICES)
    market = models.CharField(max_length=50, choices=MARKET_CHOICES)
    agencyID = models.CharField(max_length=30, unique=True, blank=True, null=True)
    clientID = models.CharField(max_length=30, unique=True, blank=True, null=True)
    prjmanager = models.CharField(max_length=64, unique=False, blank=True, null=True)
    acclead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    artdirector = models.CharField(max_length=64, unique=False, blank=True, null=True)
    prdlead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    intlead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    prjname = models.CharField(max_length=200, unique=True)
    prjstatus = models.CharField(max_length=50, choices=STATUS_CHOICES)
    as_of = models.DateField(auto_now_add=False)
    format = models.CharField(max_length=64, unique=False, blank=True, null=True)
    target_studio = models.DateField(unique=False, blank=True, null=True)
    mech_return = models.DateField(unique=False, blank=True, null=True)
    comp_return = models.DateField(unique=False, blank=True, null=True)
    target_release = models.DateField(unique=False, blank=True, null=True)
    record_added = models.DateField(auto_now_add=True)
    record_modified = models.DateTimeField()
    studio_name = models.CharField(max_length=64, unique=False, blank=True, null=True)
    studio_process = models.CharField(max_length=64, unique=False, blank=True, null=True, choices=PROCESS_CHOICES)
    to_studio = models.DateTimeField(unique=False, blank=True, null=True)
    from_studio = models.DateTimeField(unique=False, blank=True, null=True)
    studio_name2 = models.CharField(max_length=64, unique=False, blank=True, null=True)
    studio_process2 = models.CharField(max_length=64, unique=False, blank=True, null=True, choices=PROCESS_CHOICES)
    to_studio2 = models.DateTimeField(unique=False, blank=True, null=True)
    from_studio2 = models.DateTimeField(unique=False, blank=True, null=True)
    comments = models.TextField(max_length=500, unique=False, blank=True, null=True)
    summary = models.TextField(max_length=500, unique=False, blank=True, null=True)
    upload_pdf = models.CharField(max_length=50, unique=False, blank=True, null=True)
    upload_achive = models.CharField(max_length=50, unique=False, blank=True, null=True)

    def __unicode__(self):
        return u'%s' % self.prjname

    class Admin: 
        pass

, из которой была получена форма модели "RecordForm".

Ответы [ 2 ]

2 голосов
/ 22 декабря 2009

Важная вещь о get - это "получить что?"

Когда вы говорите

a=ProjectRecord.objects.get()

Вы забыли предоставить какие-либо критерии выбора. Какую строку вы хотите из базы данных?

Какой ряд? Хмммм ... Как транзакция GET узнает, какая строка будет отредактирована?

Обычно мы помещаем это в URL.

Итак, вам нужно обновить urls.py, чтобы включить идентификатор записи в URL-путь. Вам нужно будет обновить определение функции просмотра, чтобы принять этот идентификатор записи. Наконец, вам нужно обновить GET и POST, чтобы использовать эту идентификацию записи, полученную из URL.


Обновление urls.py для включения идентификатора объекта. См http://docs.djangoproject.com/en/1.1/topics/http/urls/#named-groups

urlpatterns = patterns('',
    (r'^class/(?P<object_id>\d+?)/$', 'app.views.edit_record'),

Обновление функции просмотра

def edit_record( request, object_id = None ):
    if request.method == "POST":
        if object_id is None:
            return Http_404
        ProjectRecord.objects.get( pk = int(object_id) )

    etc.
0 голосов
/ 22 декабря 2009

Без дополнительной информации трудно сказать, что вам нужно изменить, но ваша догадка верна, проблема в вашем ProjectRecord.objects.get() звонке.

Вы должны передавать какую-то информацию, чтобы ограничить список одним.

В большинстве случаев вам потребуется:

ProjectRecord.objects.get(pk=id)  

Где id - это значение первичного ключа ProjectRecord, которое вы пытаетесь редактировать.

Не могли бы вы показать соответствующий код из urls.py, а также дополнительную информацию о вашей ProjectRecord модели?

...