Я использую django-закладки для одного из моих проектов и недавно обновлен до Django 1.2.1. Я заметил, что форма отправки не проверяется с момента обновления. Обратите внимание, что я подтвердил, что это работает с Django v1.1.1, поэтому новая версия и проверка полей формы отличаются.
Это модель, из которой формируется файл forms.py:
class BookmarkInstance(models.Model):
bookmark = models.ForeignKey(Bookmark, related_name="saved_instances", verbose_name=_('bookmark'))
user = models.ForeignKey(User, related_name="saved_bookmarks", verbose_name=_('user'))
saved = models.DateTimeField(_('saved'), default=datetime.now)
description = models.CharField(_('description'), max_length=100)
note = models.TextField(_('note'), blank=True)
Вид обработки POST:
if request.method == "POST":
bookmark_form = BookmarkInstanceForm(request.user, request.POST)
if bookmark_form.is_valid():
bookmark_instance = bookmark_form.save(commit=False)
bookmark_instance.user = request.user
bookmark_instance.save()
bookmark = bookmark_instance.bookmark
...
И форм.py:
class BookmarkInstanceForm(forms.ModelForm):
url = forms.URLField(label = "URL", verify_exists=True, widget=forms.TextInput(attrs={"size": 40}))
description = forms.CharField(max_length=100, widget=forms.TextInput(attrs={"size": 40}))
redirect = forms.BooleanField(label="Redirect", required=False)
tags = TagField(label="Tags", required=False)
def __init__(self, user=None, *args, **kwargs):
self.user = user
super(BookmarkInstanceForm, self).__init__(*args, **kwargs)
# hack to order fields
self.fields.keyOrder = ['url', 'description', 'note', 'redirect']
def clean(self):
if 'url' not in self.cleaned_data:
return
if BookmarkInstance.objects.filter(bookmark__url=self.cleaned_data['url'], user=self.user).count() > 0:
raise forms.ValidationError(_("You have already bookmarked this link."))
return self.cleaned_data
...
def save(self, commit=True):
self.instance.url = self.cleaned_data['url']
return super(BookmarkInstanceForm, self).save(commit)
class Meta:
model = BookmarkInstance
#fields = ('url', 'description', 'note', 'redirect')
Используя pdb, я увидел, что значения внешнего ключа для BookmarkInstance были пусты, поэтому is_valid () вернул бы false, поскольку все поля не были проверены.
Нужно ли модифицировать функцию init для явной передачи параметров внешнего ключа? Разве значения внешнего ключа не должны передаваться автоматически, как это было в v1.1.1?