2

この質問のように、同様のvalidate_uniqueオーバーライドを持つモデルがいくつかあります。これはmodels.pyにあります:

class TeachingGroup(models.Model):
    cohort = models.ForeignKey(Cohort)
    name = models.CharField(max_length=26)
    slug = models.CharField(max_length=30, editable=False)

    class Meta:
        unique_together = ('cohort', 'name')

    def validate_unique(self, exclude = None):
        from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
        slugfodder = u'%s %s' % (self.cohort.year_group.shortname, self.name)
        self.slug = slugify(slugfodder)
        options = dict(slug = self.slug, cohort__year_group__school = self.cohort.year_group.school)
        hits = TeachingGroup.objects.exclude(pk=self.pk).filter(**options)
        if hits.exists():
            template = """The name is used for database lookups,
                and '{0}' is too similar to '{1}', as both become
                '{2}' in your web browser's address bar."""
            message = template.format(self.name, hits[0].name, self.slug)
            raise ValidationError({NON_FIELD_ERRORS: [message]})
        super(TeachingGroup, self).validate_unique(exclude=exclude)

そこにコメントするのに十分な評判はありませんが、最後に行を追加することで、モデルの検証superをバイパスしないようです。Meta: unique_together

簡潔にするために、モデル構造は含めていませんが、上記の検証はすべて、既存のオブジェクトを変更するために、管理サイトで正常に機能しています(スラッグが同一になるように名前を十分に類似させた場合、エラーが表示されます)新しいオブジェクトを追加するため。

レンダリングされたWebページでは、既存のレコードを変更すると期待どおりにエラーメッセージが表示されますが、フォームから(インスタンスなしで)新しいオブジェクトを追加すると、奇妙なことにエラーメッセージが表示されます。代わりに、次のような一連のエラーが発生します。

File "models.py" in validate_unique
  125.         slugfodder = u'%s %s' % (self.cohort.year_group.shortname, self.name)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/related.py" in __get__
  301.                 raise self.field.rel.to.DoesNotExist

pdbの場合:

-> slugfodder = u'%s %s' % (self.cohort.year_group.shortname, self.name)
(Pdb) self
*** DoesNotExist:

では、管理サイトはどのように「自己」に対して検証するのでしょうか。私の検証は次のようなことをする必要がありますsave(commit = False)か?

もちろん、さらに詳細を追加することもできますが、関連するものはここにあると思います。

4

1 に答える 1

0

さて、ここでのクレジットはありません:私はいくつかの愚かなビュー機能を持っていました、それは私があまり乾燥していないことを知っていました、そしてそれは前述のように愚かであることがわかりました。

私のこれまでの標準views.pyエントリ:

def edit_object(request, slug=None):
    try:
        obj = MyModel.objects.get(name=slug)
        if request.method == 'POST':
            if request.POST.get('delete'):
                obj.delete()
                return redirect(list_objects)
            form = MyModelForm(request.POST, request=request, instance=obj)
            if form.is_valid():
                form.save()
                return redirect(list_objects)
        else:
            form = MyModelForm(request=request, instance=obj)
    except MyModel.DoesNotExist:
        if request.method == 'POST':
            form = MyModelForm(request.POST, request=request)
            if form.is_valid():
                form.save()
                return redirect(list_objects)
        else:
            form = MyModelForm(request=request)
    return render_to_response('edit_objects.html', locals(), context_instance=RequestContext(request))

私の新しいviews.py

def edit_object(request, slug=None):
    if slug:
        options = dict(name = slug)
        obj = get_object_or_404(MyModel, **options)
    else:
        obj = MyModel()
    if request.method == 'POST':
        if request.POST.get('delete'):
            obj.delete()
            return redirect(list_objects)
        form = MyModelForm(request.POST, request=request, instance=obj)
        if form.is_valid():
            form.save()
            return redirect(list_objects)
    else:
        form = MyModelForm(instance=obj, request=request)
    return render_to_response('edit_objects.html', locals(), context_instance=RequestContext(request))

私はまだ問題があります:行:

obj = MyModel()

validate_uniqueでエラーが発生しますが、近づいています。私が使用した:

obj = Cohort(year_group = theschool.yeargroup_set.all()[:1].get())

これはかなり醜く、そのようなコホートがない場合は例外をスローします。

于 2012-04-13T11:30:01.680 に答える