2014-05-22 13 views
6

Zauważyłem rzecz, której nie znam, czy jest to poważny problem, czy też robię jakiś niewłaściwy projekt.Django form integrityerror do równoczesnej pracy na unikatowych polach

Mam model:

class A(Model): 
    name = CharField(unique=True, max_length=255) 

i ModelForm powiązane z tym ModelForm ma metodę clean_name(), która sprawdza, czy to pole jest unikalny w db (ignorować faktu, że modelforms już zrobić domyślnie określam to dla przykładu tutaj).

W widoku jeśli zrobię

o = form.save(commit=False) 
# xyz 
o.save() 

aw #xyz mam innego klienta, który wstawia się obiekt o tej samej wartości name pola, o.save() wywołuje wyjątek Integrityerror prawidłowo zapobieganie zduplikowanych rekordów do wstawienia .

Co chcę wiedzieć, jak obsługiwać te przypadki, czy powinienem opakować ten o.save() z blokiem try/except, a następnie wypełnić pole błędu w formularzu, aby wybrać inną wartość name?

Jest to dość powszechny przypadek, który powinien zdarzyć się każdemu, a to rozwiązanie jest okropne, więc myślę, że robię coś strasznie nie tak.

+0

Po prostu nie rób: o = form.save()? W ten sposób następny wpis nie zostanie zatwierdzony. – cchristelis

+0

@cchristelis w tym przypadku # xyz będzie pomiędzy form.is_valid() i form.save(). – DRC

+0

Obejście polega na tym, aby najpierw zapisać obiekt (używając wartości dummy, jeśli niektóre pola obowiązkowe są obliczane w 'xyz'), i mają pole boolowe o nazwie' obliczanie', które ustawiłeś na 'True', gdy robisz' xyz'. Po wykonaniu dodatkowej pracy możesz ją zaktualizować/usunąć w zależności od wyniku 'xyz' i ustawić' calculating' na False. Zarówno Twoja sugestia, jak i moja, są dość hackowate, więc miejmy nadzieję, że ktoś inny zaproponuje lepszy sposób na zrobienie tego. –

Odpowiedz

0

Podejrzewam, że to może być przypadek:

Wzory formularzy zapewniają wyjątkowość walidacji tylko wtedy, gdy flaga jest ustawiona w xx_clean(). Jeśli zastąpisz clean swoim własnym (jak masz), musisz zadzwonić do superklasy clean(). Zobacz overwriting the clean method.

Powiązane problemy