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