假设这是应用博客的模型:
class Blog(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField(default=datetime.now)
creator = models.ForeignKey(User)
content = BleachField()
这是应用状态的另一个模型:
class Status(models.Model):
content = BleachField()
pub_date = models.DateTimeField(default=datetime.now)
creator = models.ForeignKey(User)
我如何想出这样的事情:
from blog.models import Blog
from status.models import Status
blog = Blog.objecs.all()
status = Status.objects.all()
all = blog | status
并在模板中显示用户的所有更新。
updates = user.all_set.all()
修改
所以我可以在模板中做到这样的事情:
{% for each in all %}
....
{% endfor %}
我不想要的是,在主页中,我想以最新的顺序显示所有用户活动的更新,
例如:
'User updated with new status: blah blah'
'User published a new Blog'
'User published a new Blog'
像许多其他社交网站一样。而不是单独显示它们。同样在用户的个人资料中,显示该特定用户的所有活动。
答案 0 :(得分:1)
你应该使用django代理模型,这里是documentation。
以下是一个例子:
class BlogAndStatus(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateField()
creator = models.ForeignKey(User)
content = models.TextField()
is_blog = models.BooleanField(default=False)
is_status = models.BooleanField(default=False)
class BlogManager(models.Manager):
def get_query_set(self):
return super(BlogManager, self).get_query_set().filter(is_status=True)
class Blog(BlogAndStatus):
objects = BlogManager()
class Meta:
proxy = True
def save(self, *args, **kwargs):
self.is_blog = True
return super(Blog, self).save(*args, **kwargs)
class StatusManager(models.Manager):
def get_query_set(self):
return super(StatusManager, self).get_query_set().filter(is_blog=True)
class Status(BlogAndStatus):
objects = StatusManager()
class Meta:
proxy = True
def save(self, *args, **kwargs):
self.is_status = True
return super(Status, self).save(*args, **kwargs)
您可以使用以下命令获取所有对象:
BlogAndStatus.objects.all()
或者,使用经理,只需使用状态:
Status.objects.all()
您可以在forms.py中使用常规模型表单,只需确保将字段'is_blog'或'is_status'设置为True即可。 Blog的一个例子:
class BlogForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BlogForm, self).__init__(*args, **kwargs)
self.initial['is_blog'] = True
class Meta:
model = Blog
fields = ('title', 'content', 'is_blog')
widget = {'is_blog': forms.HiddenInput()}
答案 1 :(得分:-1)
我不确定你为什么会有这么奇怪的模特;但你能做的最好的就是:
from django.shortcuts import render
def foo(request):
photo = Photo.objects.filter(creator=request.user)
status = Status.objects.filter(creator=request.user)
context = {'photo': photo, 'status': status}
return render(request, 'template.html', context)
然后在你的模板中:
<h4>Photos:</h4>
<ul>
{% for p in photo %}
<li>{{ p }}</li>
{% endfor %}
</ul>
<h4>Status:</h4>
<ul>
{% for s in status %}
<li>{{ s }}</li>
{% endfor %}
</ul>