topwebmaster
@topwebmaster
Веб-программист, django, laravel, php, python

Django не обновляет данные на фронте после записи пользователя в группу, почему?

На фронте выводится список отфильтрованных пользователей по группе. При добавлении или удалении пользователя в группу данные на фронте обновляются только после перезагрузки приложения. В какую сторону искать?
#model.py
class User(AbstractUser):
    name = models.CharField(_("Name of User"), blank=True, max_length=255)
    homepage = models.URLField(blank=True)
    about = models.TextField(_("About Me"), blank=True)
    country = models.CharField(_("Country"), blank=True, null=True, max_length=255)
    objects = UserManager()

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})

#views
class UserAmbassadorsListView(ListView):
    model = User
    # These next two lines tell the view to index lookups by username
    slug_field = "username"
    slug_url_kwarg = "username"
    template_name = 'users/user_ambassadors.html'
    ambassadors_users = User.objects.get_grouped_users("Ambassadors")
    user_photo_from_app = FpAvatar.objects.filter

    def sumchanters(self):
        # chants = counters.videos_moderated_published
        chanter = FPVideo.objects.aggregate(Sum('chanters'))
        result = chanter['chanters__sum']
        return result

    def am_photo(self, user_id):

        try:
            user = SocialAccount.objects.filter(user_id=user_id)
            data = user.values()

            dic_data = data[0]

            provider = dic_data['provider']

            if 'vk' in provider:
                photo_big = dic_data['extra_data']['photo_big']
                return photo_big
            elif 'facebook' in provider:
                uid = dic_data['extra_data']['id']

                photo_big = 'http://graph.facebook.com/'+uid+'/picture?type=large'

                return photo_big
            elif 'google' in provider:
                photo_big = dic_data['extra_data']['picture']
                return photo_big
        except Exception:
            return 'photo'

    def get_context_data(self, **kwargs):
        """
        Returns:
            dict
        """
        ambassadors = self.ambassadors_users

        dambassadors = []
        for i in range(len(ambassadors)):
            username = ambassadors[i]
            print(username)
            number_of_videos = FPVideo.objects.count_user_videos(username)

            chanters = FPVideo.objects.sum_user_videos_chants(username)
            if chanters == None:
                chanters = 0
            try:
                usercountry = User.objects.filter(username__exact=username).values_list('country', flat=True)[0]
            except IndexError as e:
                print(e)
                usercountry = ''

            print(usercountry)
            userid = User.objects.filter(username__exact=username)
            userid = userid.values()[0]['id']

            try:
                avatar = self.user_photo_from_app(user_id=userid).values()[0]['imagefile']
                if 'media' not in avatar:
                    avatar = str('/media/')+avatar
            except IndexError:
                avatar = '/static/img/avatar.svg'
            except Exception as e:
                return e
            photo = self.am_photo(userid)

            human = (userid, username, number_of_videos, chanters, usercountry, avatar)
            dambassadors.append(human)

        keys = ('userid', 'username', 'videos', 'chanters', 'country', 'avatar')
        ambass = {}
        for i in range(len(dambassadors)):
            ambass[dambassadors[i][1]] = dict(zip(keys, dambassadors[i]))



        context = super(UserAmbassadorsListView, self).get_context_data(**kwargs)
        context['left_days'] = counters.countdowntime()
        context['ambassadors'] = ambass.items()
        context['sumchanters'] = self.sumchanters()#counters.chanters['chanters__sum']
        context['total_videos'] = counters.videos
        context['total_ambassadors'] = len(ambassadors)
        return context

template.html
<table class="ambassadors-table">
    <tr>
        <th>Position</th>
        <th>Ambassador name</th>
        <th>Country</th>
        <th>Total videos</th>
        <th>Total chants</th>
    </tr>

    {% for key, value in ambassadors %}
        <tr class="a-rows">
            <td><span></span></td>
            {#            <td>{% avatar user 65 class="img-circle img-responsive" id="user_avatar" %}</td>#}
            {#            <td><a href="{% url 'users:detail' user.username %}" class="list-group-item">{{ user.username }}</a></td>#}
            {#            {% users.username  %}#}
            <td>
{#                <div class="avatar"><img src="{{ value.photo }}"></div>#}
                <div class="avatar"><img src="{{ value.avatar }}"></div>
                {{ value.username }}</td>
            <td>{{ value.country }}</td>
            <td>{{ value.videos }}</td>
            <td class="rating">{{ value.chanters }}</td>
        </tr>
    {% endfor %}
</table>
  • Вопрос задан
  • 492 просмотра
Пригласить эксперта
Ответы на вопрос 2
tema_sun
@tema_sun
Вот этот атрибут
ambassadors_users = User.objects.get_grouped_users("Ambassadors")
вычисляется один раз. И далее используется уже результат вычислений.

Поэтому
ambassadors = self.ambassadors_users
всегда одинаковый.
Ответ написан
alex_deerk
@alex_deerk
В ответах некомпетентен. Пытаю Python
Без JS страница "жить" не будет
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы