2009-02-08 11 views
17

mam prosty model, który jest zdefiniowany jako:formularz Django nie walidacji na unikalnej dziedzinie

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

i formy:

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

Walidacja tutaj nie powiedzie się przy próbie aktualizacji istniejącego wiersz:

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

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

Tworzenie nowego wpisu jest w porządku, jednak kiedy próbuję aktualizować dowolne z tych pól, walidację nie Karnety.

„błędy” własność nie miał nic, ale spadła do debuggera i głęboko w trzewiach Django Widziałem to:

ślimak: „Artykuł ten Żaden już istnieje”

tak wygląda is_valid() kończy się niepowodzeniem na unikatowej kontroli wartości, ale wszystko, co chcę zrobić, to: aktualizacja wiersz.

Nie mogę po prostu zrobić:

form.save(force_update=True) 

... bo forma nie powiedzie się na walidacji.

To wygląda na coś bardzo prostego, ale po prostu nie mogę tego rozgryźć.

Używam Django 1.0.2

Co croaks jest BaseModelForm.validate_unique(), która jest wywoływana na formularzu inicjalizacji.

+1

Proszę edytować i dodawać swój kod formularza. – Soviut

Odpowiedz

23

Nie sądzę, że faktycznie aktualizujesz istniejący artykuł, ale zamiast tego tworzysz nowy, prawdopodobnie z mniej więcej taką samą zawartością, szczególnie z ślimakiem, a więc dostaniesz błąd. To trochę dziwne, że nie otrzymujesz lepszych raportów o błędach, ale też nie wiem, jak wygląda reszta twojego widoku.

Co zrobić, jeśli spróbujesz czegoś wzdłuż tych linii (dodałem nieco więcej funkcji widoku, zmień ją, aby pasowała do twoich potrzeb); Ja nie faktycznie testowany mojego kodu, więc jestem pewien, że zrobiłem co najmniej jeden błąd, ale należy przynajmniej uzyskać ogólne pojęcie:

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

Rzecz jest, jak wspomniano Taurean, należy instancję twój model formularza z obiektem, który chcesz zaktualizować, w przeciwnym razie dostaniesz nowy.

+0

Zrobiłem odmianę tego. Kiedy przypisuję instancję artykułu, nad którym pracuję, sprawdza się. W przeciwnym razie Django chce utworzyć nowy obiekt. –

2

Wszystko, co mogę zgadnąć, to to, że otrzymujesz obiekt do wypełnienia formularza i próbujesz go zapisać ponownie.

Spróbuj użyć ModelForm i zainicjuj go żądanym obiektem.

1

Wygląda na to, że SlugField zwraca None i ponieważ zerowy/pusty plik już istnieje gdzieś w bazie danych, podając błąd "już istnieje". Wygląda na to, że twoje pole ślimaka nie zapisuje w ogóle poprawnie.

+0

W rzeczywistości okazało się, że brak etykiety. Kiedy dodałem label = 'slug', wiadomość stała się {'slug': [u'Article z tym ślimakiem już istnieje.]]} –

4

Szukałem również sposobu na aktualizację istniejącego rekordu, nawet wypróbowałem form.save(force_update=True), ale otrzymałem błędy? Po próbie & wystąpił błąd podczas aktualizacji istniejącego rekordu. Poniżej testowane kody robocze. Mam nadzieję że to pomoże...

models.py z 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}) 

zmiana istniejącego rekordu

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