django - 为什么我当前的用户看不到自己的收件箱,但可以看到其他用户的收件箱?
问题描述
所以我试图在收件箱中查询和显示两个用户之间的消息。我遇到了一个没有消息出现的问题request.user
。有消息时显示为空。但是,当我进入另一个用户的收件箱时,我request.user
在仍然登录的情况下request.user
发送了消息,我可以看到来自双方的消息并正确显示。
所以基本上我当前的用户无法访问他们自己的消息。我知道我需要以request.user
某种方式传递到模板中才能正确查询消息,但我不确定如何。
设置/模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
消息.html
{% for msg in messages %}
{% if msg.receiver_id == user.id %}
<li class="text-right list-group-item">{{ msg.message }}<br/>{{ msg.date }}<br/>{{ request.user.username }}</li>
{% elif msg.sender_id == user.id %}
<li class="text-left list-group-item">{{ msg.message }}<br/>{{ msg.date }}</li>
{% endif %}
{% empty %}
{%endfor %}
views.py/messages
def messages(request, profile_id):
messages = InstantMessage.objects.filter(Q(sender_id=request.user, receiver_id=profile_id,)
| Q(sender_id=profile_id, receiver_id=request.user,) ).\
values('sender_id','receiver_id', 'message', 'date', ).\
order_by('date',)
return render(request, 'dating_app/messages.html', {'messages': messages,})
urls.py/消息
path('messages/<int:profile_id>/', views.messages, name='messages')
base.html/messages 网址链接
<a class="nav-link" href="{% url 'dating_app:messages' user.id %}">Check Messages</a
模型.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager, User
from dating_project import settings
from django.contrib.auth import get_user_model
class ProfileManager(BaseUserManager):
def create_user(self, username, email,description,photo, password=None):
if not email:
raise ValueError("You must creat an email")
if not username:
raise ValueError("You must create a username!")
if not description:
raise ValueError("You must write a description")
if not photo:
raise ValueError("You must upload a photo")
user = self.model(
email=self.normalize_email(email),
username = username,
description= description,
photo= photo,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email,description,photo, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
description=description,
photo=photo,
)
user.is_admin=True
user.is_staff=True
user.is_superuser=True
user.save(using=self._db)
return user
class Profile(AbstractBaseUser):
class Meta:
swappable = 'AUTH_USER_MODEL'
email = models.EmailField(verbose_name="email")
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
#what I added
description = models.TextField()
photo = models.ImageField(upload_to='profile_photo',blank=False, height_field=None, width_field=None, max_length=100)
matches = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='+', blank=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['description','photo','email']
objects = ProfileManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self,app_label):
return True
class UserVote(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
voter = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='given_vote', on_delete=models.CASCADE)
vote = models.BooleanField(default=False)
class Meta:
unique_together = (('user', 'voter'))
class InstantMessage(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'senderr',on_delete=models.CASCADE )
receiver = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
message = models.TextField()
date = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.message
解决方案
我认为你的问题出在views.py/messages
. 您正在过滤来自 user->profile 或 profile->user 的消息。但是您链接到配置文件和用户相同的 URL。因此,在该页面上,您只会收到发送者和接收者相同的消息。
def messages(request, profile_id):
messages = InstantMessage.objects.filter(Q(sender_id=request.user, receiver_id=profile_id,)
| Q(sender_id=profile_id, receiver_id=request.user,) ).\
values('sender_id','receiver_id', 'message', 'date', ).\
order_by('date',)
return render(request, 'dating_app/messages.html', {'messages': messages,})
您可能应该使用此查询创建不同的视图来显示与当前用户之间的消息。
messages = InstantMessage.objects.filter(Q(sender_id=request.user) | Q( receiver_id=request.user)).\
values('sender_id','receiver_id', 'message', 'date', ).\
order_by('date',)
编辑:使用对话模型的建议。
class Conversation(models.Model):
members = models.ManyToManyField(settings.AUTH_USER_MODEL)
@property
def last_message_time(self):
try:
return self.instantmessage_set.order_by('-date').first().date
except self.instantmessage_set.DoesNotExist:
pass
def __unicode__(self):
return ', '.join(self.members.all())
class InstantMessage(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'senderr',on_delete=models.CASCADE )
conversation = models.ForeignKey(Conversation, models.CASCADE)
# Don't need this if it belongs to a conversation
# receiver = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
message = models.TextField()
date = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.message
在视图中,您可以使用 访问对话{{ user.conversation_set.all }}
。
消息.html
{% for conversation in user.conversation_set.all %}
<li class="text-right list-group-item">
{% for member in conversation.members.all %}{% if member != user %}
{{ member.username }}<br/>
{% endif %}{% endfor %}
{{ conversation.last_message_time }}
</li>
{%endfor %}
推荐阅读
- r - 使用列名作为 ggplot 的 x
- c - 如何只允许浮点数到小数点后两位
- ios - 如何创建 cocoapod 框架并向其中添加文件?
- ios - 如何在水平方向添加节标题
- ios - Siesta-Swift:有没有办法查明 Resource.latestData 是否发生了变化?
- python - PyLint 在 Visual Studio 代码上显示大量错误
- python - 计算布局中检查的 QCheckBox 数量 - PyQt5
- php - PHP - 将ΓÇô 转换为撇号
- c# - 为什么 Picasa 网络相册数据 API 返回“Content-Type text/xml 不是有效的输入类型”。使用 C# 发布照片时
- javascript - CoffeeScript:HTTPS 发布到 API,处理响应