У меня есть модель Меню:
class Menu(models.Model):
loja = models.ForeignKey(Loja, related_name='menus')
nome = models.CharField(max_length=30)
ordenacao = models.IntegerField(blank=True, null=True)
class Meta:
ordering = ('ordenacao',)
#prevent equally named menus within a store(loja)
unique_together = ('loja', 'nome')
def __unicode__(self):
return self.nome
Форма меню:
class MenuForm(ModelForm):
class Meta:
model = Menu
exclude =('loja', 'ordenacao',)
Добавить вид меню:
def addmenu(request, s_loja):
loja = get_object_or_404(Loja, slug=s_loja)
if not loja.activo:
return render_to_response('painelcontrolo/loja_detail.html', {
'notificacoes': ['Loja está definida como inactivo.', \
'Alterações não permitidas']})
if request.method == 'POST':
menu = Menu(loja=loja)
form = MenuForm(request.POST, instance=menu)
if form.is_valid():
menu_existe = Menu.objects.\
filter(nome=form.cleaned_data['nome']).\
filter(loja=loja)
if menu_existe:
return render_to_response(\
'painelcontrolo/loja_detail.html', {
'notificacoes': ['Já existe um menu com esse nome']
})
form.save()
return render_to_response(\
'painelcontrolo/loja_detail.html', {
'notificacoes': ['Menu adicionado']
})
else:
form = MenuForm()
return render_to_response('form_as_p.html', {
'form': form
})
Ошибка: (больше не возникает с добавленной проверкой в представлении addmenu)
Request Method: POST
Request URL: http://127.0.0.1:8000/painel/bispos/addmenu/
Exception Type: IntegrityError
Exception Value: columns loja_id, nome are not unique
Вопрос:
Форма действительна, но модель не существует, если в базе данных уже существует nome + loja_id. Нужно ли добавить эту проверку в другом месте? А где?
редактирование:
Я написал проверку для представления, и он передает уведомление в шаблон, и это нормально, но не идеально. Я хотел бы повторно отобразить форму с пользовательским вводом, чтобы дать возможность исправить то, что не так, без потери этой информации. Есть ли способ сделать это?