Я хочу, чтобы кнопка регистрации исчезала при регистрации (в шаблонах django) ' - PullRequest
1 голос
/ 11 октября 2019

enter image description here

Модель

class TeamMember(models.Model):
    team = models.ForeignKey(TeamInfo, on_delete=models.CASCADE)
    member = models.ForeignKey(User, on_delete=models.CASCADE)
    position = models.CharField(max_length=50,default="member")

class TeamInfo(models.Model):
    leader = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
    team_name = models.CharField(max_length=50, unique=True)
    team_description = models.TextField(blank=True)
    member_count = models.IntegerField(default=1)

    def __str__(self):
        return self.team_name

Просмотр

class TeamInfoListView(LoginRequiredMixin,ListView):
    model = TeamInfo
    paginate_by = 20

шаблон (https://github.com/hyunsokstar/django_inflearn2/blob/master/todo/templates/todo/teaminfo_list.html)

{% for tm in p.teammember_set.all %}
    {% if tm.member.username == request.user.username %}
        <a class="btn btn-outline-info btn-sm team_register_button" data-id = {{p.id}} data-user={{request.user.id}} >탈퇴</a>
    {% endif %}
{% endfor %}

У меня два вопроса.

1.Как можно заставить кнопку регистрации исчезнуть при регистрации пользователя? 2.Для логики в настоящее время она неэффективна ~! Есть ли способ ее улучшить?

Спасибо, что сообщили мне об этом.

============================================================================

Как высказал, что я создал логику, используя get_context_data и filter () в views.py, чтобы решить эту проблему. Спасибо

проблема решена этой

class TeamInfoListView(LoginRequiredMixin,ListView):
    model = TeamInfo
    paginate_by = 20

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super(type(self), self).get_context_data(**kwargs)
        myteam=TeamMember.objects.filter(member=self.request.user)

        if myteam.exists():
            myteam=TeamMember.objects.get(member=self.request.user).team
            print("myteam : ", myteam)

        context['myteam']= myteam

        return context
<td>
    {% if p.team_name == myteam.team_name %}
        <a class="btn btn-outline-info btn-sm team_register_button" data-id = {{p.id}} data-user={{request.user.id}} >탈퇴</a>
    {% else %}
        <a class="btn btn-outline-info btn-sm team_register_button" data-id = {{p.id}} data-user={{request.user.id}} >가입</a>
    {% endif %}
</td>

enter image description here

Ответы [ 4 ]

1 голос
/ 11 октября 2019

Вероятно, наиболее оптимальным способом является использование annotation следующим образом:

Сначала переопределите get_queryset() метод:

from django.db.models import Case, When, Value, BooleanField

 class TeamInfoListView(LoginRequiredMixin,ListView):
     model = TeamInfo
     paginate_by = 20

    def get_queryset(self):
       queryset = super(TeamInfoListView, self).get_queryset()
       queryset = queryset.annotate(subscribed = Case(
           When(teammember__member=self.request.user, then=Value(True)),     
           default=Value(False),
           output_field=BooleanField(),)
       )
       return queryset

Затем в шаблоне:

{% for team in object_list %}
    {% if not team.subscribed %}
        <a class="btn btn-outline-info btn-sm team_register_button" data-id = {{p.id}} data-user={{request.user.id}} >가입</a>
    {% endif %}
{% endfor %}

Этот способ наиболее оптимизирован, поскольку вы рассчитываете, подписан пользователь или нет на уровне БД, также он будетвыполняется один раз. И вам не нужно писать какую-либо логику if-else в forloop внутри шаблона.

1 голос
/ 11 октября 2019

А как насчет передачи переменной из вашего представления?

Просмотр кода

def your_view(request):
    member_of_teams = TeamMember.objects.filter(member=request.user)
    context = {'member_of_teams':member_of_teams}
    return render("yourtemplate.html", request, context)

Затем вы можете использовать цикл for для циклического прохождения через меньшее количество элементов.

Что касается того, как скрыть кнопку, то, что у вас уже есть с

{% if tm.member.username == request.user.username %}

, должно работать. Вам просто нужно изменить его, чтобы увидеть, совпадает ли команда с элементами в member_of_teams, а не с именем пользователя.

1 голос
/ 11 октября 2019

Вы можете сделать 2 вещи здесь:

  1. Переопределить ваши get_context_data, чтобы вернуть команды, в которых зарегистрированный пользователь является членом:
def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)
    context['logged_in_user_teams'] = TeamInfo.objects.filter(team_member__user=request.user)
    return context

Затем просто проверьтев вашем шаблоне, если отображаемая вами команда находится в этом списке:

{% for team in object_list %}
    {% if not team in logged_in_user_teams %}
        <a>Subscribe</a>
    {% endif %}
{% endfor %}

Также обратите внимание, что мы выполняем итерации по object_list, поскольку именно это ListView устанавливает в контексте.

Оставьте все как есть (но исправьте object_list в шаблоне) и напишите небольшой шаблонный фильтр:
{% for team in object_list %}
    {% if not team|contains:request.user %}
        <a>Subscribe</a>
    {% endif %}
{% endfor %}

Ваш фильтр шаблона должен выглядеть примерно так:

def contains(team, user):
    return team.teammember_set.filter(member=user).exists()
0 голосов
/ 11 октября 2019

Вы можете установить пустой шаблон в шаблоне django, чтобы ничего не отображать.

{% for tm in p.teammember_set.all %}
{% if tm.member.username == request.user.username %}
    <a class="btn btn-outline-info btn-sm team_register_button" data-id = 
{{p.id}} data-user={{request.user.id}} >탈퇴</a>
{% else %}
    <a class="btn btn-outline-info btn-sm team_register_button">Subscribe</a>
{% endif %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...