Подтвердить что ты не робот

Форма Django не выполняет проверку на уникальном поле

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

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()

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

Свойство "errors" не имело ничего, но я попал в отладчик и глубоко в кистях Django, я увидел это:

slug: "Статья с этим Нет уже существует"

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

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

form.save(force_update=True)

... потому что форма не будет проверена.

Это похоже на что-то очень простое, но я просто не могу понять.

Я запускаю Django 1.0.2

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я также искал способ обновить существующую запись, даже попробовал 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})

Ответ 3

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

Попробуйте использовать ModelForm и начните с целевого объекта.

Ответ 4

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