2009-09-29 75 views

回答

7

如果只是要影响(而不想影响数据库模型)的管理员,您可以创建自定义的ModelAdmin子类:

class HomePageAdmin(admin.ModelAdmin): 
    def add_view(self, request): 
     if request.method == "POST": 
      # Assuming you want a single, global HomePage object 
      if HomePage.objects.count() > 1: 
       # redirect to a page saying 
       # you can't create more than one 
       return HttpResponseRedirect("foo") 
     return super(HomePageAdmin, self).add_view(request) 

# ... 

admin.site.register(HomePage, HomePageAdmin) 

做同样事情的另一种策略是为HomePage创建一个自定义的ModelForm,其中一个clean方法强制执行单个主页的要求。这会让你的需求出现验证错误,而不是作为一个重定向比(或者数据库错误):

from django import forms 
from django.forms.util import ErrorList 

class HomePageModelForm(forms.ModelForm): 
    def clean(self): 
     if HomePage.objects.count() > 1: 
      self._errors.setdefault('__all__', ErrorList()).append("You can only create one HomePage object.") 
     return self.cleaned_data 

# ... 
class HomePageAdmin(admin.ModelAdmin): 
    form = HomePageModelForm 

# ... 

admin.site.register(HomePage, HomePageAdmin) 

如果它的“每个用户一个主页”,你将需要主页有一个ForeignKey到用户并适应以上。您可能还需要将当前的User对象存储在threadlocals中以便从HomePageModelForm.clean

+0

中访问它,谢谢..这是一个非常明确的解释;) – israkir 2009-10-02 20:12:26

0

如果你想限制Homepage为每个用户一个,那么你可以使用一对一的关系,与OneToOneField。至于限制为N - a pre_save signal可能会有用。

0

尝试

class HomePage(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    homepage = models.CharField(max_length=100, unique=True) 

    class Meta: 
    unique_together = (("user", "homepage"),) 
相关问题