英文:
Having trouble with notifications feature in Django
问题
<div class="dropdown-content" id="myDropdown">
{% if notifications %}
{% for notification in notifications %}
{% if notification.notification_type == 'created' %}
<a href="#">{{notification.ticket.name}}: 有新工单分配给你。</a>
{% else %}
<a href="#">{{notification.ticket.name}}: 工单已更新。</a>
{% endif %}
{% endfor %}
{% else %}
<a href="#">没有新通知。</a>
{% endif %}
</div>
英文:
Created a notification feature in my django project. I've got all the functionality down and it works except for one thing. I want the template to display a different message depending on what action is committed. All it currently displays is 'The ticket has been updated' instead of 'A new ticket has been assigned to you.' How do I fix this?
Here is what i have so far.
template
<div class="dropdown-content" id="myDropdown">
{% if notifications %}
{% for notification in notifications %}
{% if notification.notification_type == 'created' %}
<a href="#">{{notification.ticket.name}}: A new ticket has been assigned to you.</a>
{% else %}
<a href="#">{{notification.ticket.name}}: The ticket has been updated.</a>
{% endif %}
{% endfor %}
{% else %}
<a href="#">No new notifications</a>
{% endif %}
</div>
models.py for notification
class Notification(models.Model):
OPTIONS = (
('created', 'created'),
('updated', 'updated'),
)
recipient = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, related_name='notifications')
ticket = models.ForeignKey(Ticket, on_delete=models.SET_NULL, null=True, related_name='notifications')
message = models.TextField()
notification_type = models.CharField(choices=OPTIONS, max_length=15, null=True)
is_read = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
signals.py for notification
@receiver(post_save, sender=Ticket)
def create_notification(sender, instance, created, **kwargs):
if created:
notification_type = 'created'
else:
notification_type = 'updated'
assignees = instance.assignee.all()
for assignee in assignees:
Notification.objects.create(recipient=assignee, notification_type=notification_type)
this is createTicket function inside the views.py
@login_required
def createTicket(request):
form = TicketForm()
categories = Category.objects.all()
users = CustomUser.objects.all()
if request.method == 'POST':
category_name = request.POST.get('category')
category, created = Category.objects.get_or_create(name=category_name)
# Retrieve the project object that the ticket should be connected with
project_id = request.POST.get('project')
project = Project.objects.get(id=project_id)
# Retrieve the list of selected users from the form
assignee_ids = request.POST.getlist('assignee')
assignee = CustomUser.objects.filter(id__in=assignee_ids)
ticket = Ticket.objects.create(
host = request.user,
category=category,
project=project,
name=request.POST.get('name'),
status=request.POST.get('status'),
priority=request.POST.get('priority'),
type=request.POST.get('type'),
description=request.POST.get('description'),
)
# Add the selected users to the ticket
ticket.assignee.set(assignee)
ticket.save()
return redirect('ticket', pk=ticket.id)
context = {'form': form, 'categories': categories, 'users': users}
return render(request, 'tickets/ticket_form.html', context)
答案1
得分: 0
ticket = Ticket.objects.create(
host=request.user,
category=category,
project=project,
name=request.POST.get('name'),
status=request.POST.get('status'),
priority=request.POST.get('priority'),
type=request.POST.get('type'),
description=request.POST.get('description'),
)
# 将选择的用户分配给工单
ticket.assignee.set(assignee)
ticket.save()
这将触发两次信号,一次是create
,另一次是save
。
你不需要最后一行,只需要写:
ticket.assignee.set(assignee)
就足够了。
另外,当你创建工单并且信号触发时,你还没有assignee
,你应该通过m2m_changed信号来实际处理它。
<details>
<summary>英文:</summary>
ticket = Ticket.objects.create(
host = request.user,
category=category,
project=project,
name=request.POST.get('name'),
status=request.POST.get('status'),
priority=request.POST.get('priority'),
type=request.POST.get('type'),
description=request.POST.get('description'),
)
# Add the selected users to the ticket
ticket.assignee.set(assignee)
ticket.save()
This will trigger your signals twice, 1 for `create` and another one for `save`.
You don't need the last line, just put
ticket.assignee.set(assignee)
is enough.
Btw when you create a ticket and signal triggers, you don't have any `assignee` yet, you should actually do it via [m2m_changed][1] signal
[1]: https://docs.djangoproject.com/en/4.1/ref/signals/#m2m-changed
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论