纠正Django模板的if/else语句语法 [英] Correct if/else statement syntax for django templates
问题描述
我有一个约会应用程序,我需要在用户匹配的每个个人资料下方创建一个链接.然后,该链接应将其用户ID传递到模板中,以便仅根据用户ID在当前用户和该特定用户之间显示消息.我在使用Django模板中的if/else语句的语法时遇到麻烦.我将如何去做?
I have a dating app and I need to create a link that is underneath each profile that a user matches on. Then, that link should pass their user id into the template so that messages are only displayed between the current user and that particular user based on the user id. I am having trouble here with the syntax of if/else statements within the Django template. How would I go about doing this?
** base.html/href消息链接**
**base.html/href messages link **
<li class="nav-item">
<a class="nav-link" href="{% url 'dating_app:messages' user.id %}">Check Messages</a>
</li>
models.py/InstantMessage
class InstantMessage(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'sender',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
messages.html
<div id="msg-list-div" class="panel-body">
<ul id="msg-list" class="list-group">
<br><br><br>
{% for obj in messages %}
{% if obj.sender == request.user and obj.receiver == profile%}
{% if obj.sender == request.user%}
<li class="text-right list-group-item">{{obj.message}}<br>{{ obj.date }}<li>
{% elif obj.receiver == profile %}
<li class="text-left list-group-item">{{obj.message}}<br>{{ obj.date }}<li>
{%endif%}
{%endif%}
{% empty %}
<li class="text-right list-group-item">No messages yet...Keep mingling!</li>
{% endfor %}
</ul>
</div>
matches.html/href链接为messages.html
<p><a href="{% url 'dating_app:messages' profile.id %}">chat</a></p>
views.py/messages
def messages(request, profile_id):
messages = InstantMessage.objects.all()
profile = get_object_or_404(Profile,id=profile_id)
return render(request, 'dating_app/messages.html', {'messages': messages,'profile':profile,})
models.py
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= 'sender',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
整个模型.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
推荐答案
正如已经建议的那样,最好在视图中而不是在模板中完成所有繁重的工作:
As already suggested it is better to do all heavy work in a view, not in a template:
def messages(request, profile_id):
messages = InstantMessage.objects.filter(sender=request.user, receiver_id=profile_id, )
profile = get_object_or_404(Profile,id=profile_id)
...
想象一下,如果 InstantMessage
包含数十亿条记录- InstantMessage.objects.all()
的工作速度有多快?以及出于什么原因.
Imagine if InstantMessage
contains billions of records - how fast would InstantMessage.objects.all()
work? And for what reason.
由于您要呈现聊天",我想您需要这样的东西:
And since you want to render "a chat", I guess you need something like this:
from django.db.models import Q
...
messages = InstantMessage.objects.filter(Q(sender_id=request.user.id, receiver_id=profile_id,)
| Q(sender_id=profile_id, receiver_id=request.user.id,) ).\
values('sender_id', 'message', 'date', ).\
order_by('date',)
另请参见文档.
和模板:
{% for msg in messages %}
<li class="{% if msg.sender_id == request.user.id %}text-right{% else %}text-left{% endif %} list-group-item">
{{ msg.message }}<br/>{{ msg.date }}
</li>
{% empty %}
...
{% endfor %}
这篇关于纠正Django模板的if/else语句语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!