Форма Джанго не проходит проверку на уникальном поле - PullRequest
19 голосов
/ 09 февраля 2009

У меня есть простая модель, которая определяется как:

class Article(models.Model):
    slug  = models.SlugField(max_length=50,  unique=True)
    title = models.CharField(max_length=100, unique=False)

и форма:

class ArticleForm(ModelForm):
    class Meta:
       model = Article

Проверка здесь завершается неудачно, когда я пытаюсь обновить существующую строку:

 if request.method == 'POST':
     form = ArticleForm(request.POST)

     if form.is_valid(): # POOF
         form.save()

Создание новой записи - это хорошо, однако, когда я пытаюсь обновить любое из этих полей, проверка больше не проходит.

Свойство «ошибки» не имело ничего, но я упал в отладчик и, глубоко в духе Джанго, увидел следующее:

slug: «Статья с этим None уже существует»

Таким образом, похоже, что is_valid () завершается неудачно при проверке уникального значения, но все, что я хочу сделать, это обновить строку.

Я не могу просто сделать:

form.save(force_update=True)

... потому что форма не пройдёт проверку.

Это выглядит как нечто очень простое, но я просто не могу понять это.

Я использую Django 1.0.2

Что квакает, это BaseModelForm.validate_unique (), которая вызывается при инициализации формы.

Ответы [ 4 ]

26 голосов
/ 09 февраля 2009

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

Что если вы попробуете что-то в этом духе (я включил чуть больше возможных функций просмотра, измените их в соответствии с вашими потребностями); Я на самом деле не тестировал свой код, поэтому уверен, что совершил хотя бы одну ошибку, но вы должны хотя бы получить общее представление:

def article_update(request, id):
   article = get_objects_or_404(Article, pk=id)

   if request.method == 'POST':
      form = ArticleForm(request.POST, instance=article)

      if form.is_valid():
         form.save()

         return HttpResponseRedirect(to-some-suitable-url)

   else:
      form = ArticleForm(instance=article)

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

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

4 голосов
/ 18 марта 2009

Я также искал способ обновить существующую запись, даже пытался form.save(force_update=True), но получил ошибки ?? Наконец методом проб и ошибок удалось обновить существующую запись. Ниже проверенные коды работают. Надеюсь, это поможет ...

models.py из djangobook

class Author(models.Model):
    first_name = models.CharField(max_length=30)

    last_name = models.CharField(max_length=40)

    email = models.EmailField(blank=True, verbose_name='e-mail')

    objects = models.Manager()

    sel_objects=AuthorManager()

    def __unicode__(self):
        return self.first_name+' '+ self.last_name

class AuthorForm(ModelForm):
    class Meta:
        model = Author


# views.py
# add new record

def authorcontact(request):

    if request.method == 'POST':

        form = AuthorForm(request.POST)

        if form.is_valid():

            form.save()

            return HttpResponseRedirect('/contact/created')

    else:

        form = AuthorForm()

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

обновить существующую запись

def authorcontactupd(request,id):

    if request.method == 'POST':

        a=Author.objects.get(pk=int(id))

        form = AuthorForm(request.POST, instance=a)

        if form.is_valid():

            form.save()

            return HttpResponseRedirect('/contact/created')

    else:
        a=Author.objects.get(pk=int(id))

        form = AuthorForm(instance=a)

    return render_to_response('author_form.html', {'form': form})
2 голосов
/ 09 февраля 2009

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

Попробуйте использовать ModelForm и создайте для него нужный объект.

1 голос
/ 09 февраля 2009

Похоже, что ваш SlugField возвращает None, и поскольку пустой / пустой слаг уже существует где-то в базе данных, он выдает ошибку «уже существует». Похоже, ваше поле слагов вообще не сохраняется правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...