MU
14 февраля 2019 г. 5:30

Django change button status

django, Django, Python

Hi,

I search through internet and review many apps but still don't have answer maybe on this forum someone help me.

I try to create changing button after user join to Goal.

I have work buttons, but i don't know how to change this in template.

I try to do this with boolean field, when user click "Join", boolean field change to True, and then in templates:

  1. {% if goal.joined %}
  2. <Delete join>
  3. {% else %}
  4. <join to goal>
  5. {% endif %}

For now user can click many times on button and create many "join" objects in one goal.
Now i know that i need to create variable in view that checks if the current user has joined the goal and add it to the context. But I don't know how. Im still newby.

  1. class Goal(models.Model, Activity):
  2. title = models.CharField(max_length=255, verbose_name='Tytuł')
  3. image = models.ImageField(upload_to='goals', verbose_name='Tło')
  4. body = HTMLField(verbose_name='Treść')
  5. tags = TaggableManager()
  6. created_at = models.DateTimeField(auto_now_add=True)
  7. author = models.ForeignKey(User, on_delete=models.CASCADE)
  8. slug = AutoSlugField(populate_from='title')
  9.  
  10. def __str__(self):
  11. return self.title
  12.  
  13. class Meta:
  14. verbose_name = 'Cele'
  15. ordering = ['-created_at']
  16.  
  17. def get_absolute_url(self):
  18. return reverse('goaldetail', args=[str(self.slug)])
  19.  
  20. @property
  21. def activity_actor_attr(self):
  22. return self.author
  23.  
  24. def add_user_to_list_of_attendees(self, user):
  25. registration = Joined.objects.create(user = user,
  26. goal = self,
  27. created_at = timezone.now())
  28.  
  29. def remove_user_from_list_of_attendees(self, user):
  30. registration = Joined.objects.get(user = user, goal = self)
  31. registration.delete()
  32.  
  33. class Joined(models.Model, Activity):
  34. goal = models.ForeignKey(Goal, on_delete=models.CASCADE, related_name='joined')
  35. user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='joined_users')
  36. created_at = models.DateTimeField(auto_now_add=True)
  37. joined = models.BooleanField(default=False)
  38.  
  39. def save(self, *args, **kwargs):
  40. if self.id is None and self.created_at is None:
  41. self.created_at = datetime.datetime.now()
  42. self.joined = True
  43. super(Joined, self).save(*args, **kwargs)
  44.  
  45. @property
  46. def activity_actor_attr(self):
  47. return self.user

Views:

  1. def joined_add(request, pk):
  2. this_goal = Goal.objects.get(pk=pk)
  3. this_goal.add_user_to_list_of_attendees(user=request.user)
  4. return redirect('goaldetail', slug=this_goal.slug)
  5.  
  6. def joined_delete(request, pk):
  7. this_goal = Goal.objects.get(pk=pk)
  8. this_goal.remove_user_from_list_of_attendees(request.user)
  9. return redirect('goaldetail', slug=this_goal.slug)
  10.  
  11. def goaldetail(request, slug):
  12. goal = get_object_or_404(Goal, slug=slug)
  13. return render(request, 'goals/detail.html',
  14. {'goal': goal})

Path:

  1. path('joined/<int:pk>', views.joined_add, name='joined_add'),
  2. path('joined-delete/<int:pk>', views.joined_delete, name='joined_delete'),
2

Вам это нравится? Поделитесь в социальных сетях!

3
Evgenii Legotckoi
  • 14 февраля 2019 г. 13:49
  • Ответ был помечен как решение.

Hello,

I think, You need to check user in joined_set in your case.

This is your custom template tag

  1. from django import template
  2.  
  3. register = template.Library()
  4.  
  5.  
  6. @register.filter
  7. def user_in(objects, user):
  8. if user.is_authenticated:
  9. return objects.filter(user=user).exists()
  10. return False

The next step, check user in the set

  1. {% load user_in from your_template_tags %}
  2. {% if goal.joined_set.all|user_in:request.user %}
  3. <Delete join>
  4. {% else %}
  5. <join to goal>
  6. {% endif %}
    MU
    • 14 февраля 2019 г. 16:56
    • (ред.)

    Edit: Works! Thank you very much! Just change goal.joined_set.all to goal.joined.all. :D

      Evgenii Legotckoi
      • 14 февраля 2019 г. 17:00
      • (ред.)

      ok. I see. You changed related name

      Try this

      1. {% if goal.joined.all|user_in:request.user %}

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь