MU
Feb. 14, 2019, 5:30 a.m.

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

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • Feb. 14, 2019, 1:49 p.m.
  • The answer was marked as a solution.

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
    • Feb. 14, 2019, 4:56 p.m.
    • (edited)

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

      Evgenii Legotckoi
      • Feb. 14, 2019, 5 p.m.
      • (edited)

      ok. I see. You changed related name

      Try this

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

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup