【发布时间】:2013-07-20 15:44:29
【问题描述】:
我想添加一个自定义管理器,它可以从模板中调用,但不会影响整个模型(例如管理员视图),它会监听请求中的参数集(user_profile)。
以下是我目前所拥有的:
models.py:
class CurrentQuerySet(models.query.QuerySet):
def current(self):
return self.filter(id=1) ## this simplified filter test works..
class CurrentManager(models.Manager):
use_for_related_fields = True
def get_query_set(self):
return CurrentQuerySet(self.model)
def current(self, *args, **kwargs):
return self.get_query_set().current(*args, **kwargs)
为模型B定义:
objects = CurrentManager()
模板调用:
{% for b in a.b_set.current %}
但是,一旦我尝试将参数传递给该过滤器(在本例中为存储在用户配置文件中的日期),该方法就不会返回任何结果。
例如:
models.py
class CurrentQuerySet(models.query.QuerySet):
def current(self,my_date):
return self.filter(valid_from__lte=my_date)
showA.html
{% for b in a.b_set.current(request.user.get_profile.my_date) %}
我没有从模板中传递参数,而是尝试在 view.py 中设置它
@login_required
def showA(request,a_id):
my_date = request.user.get_profile().my_date
a = A.objects.get(id=a_id)
t = loader.get_template('myapp/showA.html')
c = RequestContext(request,{'a':a,'my_date':my_date,})
return HttpResponse(t.render(c))
我在这里遗漏(或误解)了哪一部分?
谢谢
R
编辑
这里是模型。如前所述,在此示例中,这是一个简单的 1:n 关系,但在其他情况下也可以是 m:n。
class A(models.Model):
#objects = CurrentManager()
a = models.CharField(max_length=200)
description = models.TextField(null=True,blank=True)
valid_from = models.DateField('valid from')
valid_to = models.DateField('valid to',null=True,blank=True)
def __unicode__(self):
return self.a
class B(models.Model):
#objects = models.Manager()
objects = CurrentManager()
a = models.ForeignKey(A)
b = models.CharField(max_length=200)
screenshot = models.ManyToManyField("Screenshot",through="ScreenshotToB")
description = models.TextField(null=True,blank=True)
valid_from = models.DateField('valid from')
valid_to = models.DateField('valid to',null=True,blank=True)
def __unicode__(self):
return self.b
编辑-2
接受的答案至少适用于一种关系。
在更嵌套的数据模型的情况下,这种方法似乎无法提供预期的结果:
models.py
class C(models.Model):
objects = CurrentManager()
b = models.ForeignKey(A)
c = models.CharField(max_length=200)
description = models.TextField(null=True,blank=True)
valid_from = models.DateField('valid from')
valid_to = models.DateField('valid to',null=True,blank=True)
def __unicode__(self):
return self.c
views.py
@login_required
def showA(request,a_id):
a = A.objects.get(id=a_id)
my_date = request.user.get_profile().my_date
b_objects = a.b_set.current(my_date)
c_objects = b_objects.c_set.current(my_date)
t = loader.get_template('controltool2/showA.html')
c = RequestContext(request,{'a':a,'b_objects':b_objects,'c_objects':c_objects,})
return HttpResponse(t.render(c))
这会返回错误:'QuerySet' object has no attribute 'c_set'。
【问题讨论】:
-
你能把这两个模型都包括在这里以便更好地帮助你吗?
-
您好,您现在可以在底部找到模型。期待您的意见,我已经每天晚上都在这个问题上闲逛了将近一个星期。 :-)
-
看看我的更新回复,看看是否能帮助你重回正轨
-
非常感谢,您的更新回复有效(稍作修正后)。当然,我会将您的回答设为“已接受”。但是这个解决方案似乎只适用于一个_set。我的真实模型更加嵌套(B 有很多 C),而且它似乎不起作用(参见原始帖子的 edit-2)
标签: django django-models django-views django-managers