как изменить голосование на голосование после того, как пользователь проголосует за выбор? - PullRequest
0 голосов
/ 13 марта 2019

Этот код работает отлично. Единственное, что я хочу изменить, это отправить кнопку «Проголосовать» на «Голосовали» после того, как пользователь проголосовал за опцию, вместо отображения сообщения об ошибке «Вы уже проголосовали». Так что пользователь может знать, за какие опции он уже проголосовал, когда он входит в систему. в следующий раз оцените опцию

urls.py

   path('<slug>/',views.options,name='options'),
   path('<slug>/vote/', views.vote, name='vote'),

models.py

 class Category(models.Model):
    name = models.CharField(max_length=250)
    slug = AutoSlugField(populate_from='name')
    details = models.TextField(blank=True)
    image = models.ImageField(blank=True,upload_to='categories')
    views = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now=True)
    modified = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Categories"


class Option(models.Model):
    name = models.CharField(max_length=250)
    slug = AutoSlugField(populate_from='name')
    image = models.ImageField(blank=True,upload_to='options')
    details = models.TextField()
    category = models.ForeignKey(Category, on_delete=CASCADE)
    votes = models.IntegerField(default=0)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name


class Vote(models.Model):
    option = models.ForeignKey(Option, on_delete=CASCADE)
    voter = models.ForeignKey(User, on_delete=CASCADE)
    slug = AutoSlugField(populate_from='option')

    def __str__(self):
        return self.voter

views.py

def options(request,slug):
category = Category.objects.get(slug=slug)
category.views += 1
category.save()
options = category.option_set.all().order_by('-votes')
if request.method == "POST":
    if request.user.is_authenticated:
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.category = category
            comment.user = request.user
            comment.save()
            messages.success(request, 'Comment Posted.')
    else:
        messages.error(request, 'You have to login first to give comment')
        return redirect('rank:login')
else:
    form = CommentForm()
return render(request, 'rank/options.html', {'options': options,'form':form,'title': 'options','category':category})

def vote(request,slug):
if request.user.is_authenticated:
    option = Option.objects.get(slug=slug)
    category = option.category

    if Vote.objects.filter(slug=slug,voter_id=request.user.id).exists():
         messages.error(request,'You Already Voted!')
         return redirect('rank:options', category.slug)
    else:
        option.votes += 1
        option.save()
        voter = Vote(voter=request.user,option=option)
        voter.save()
        messages.success(request,'Voted.{} peoples also agree with you.'.format(option.votes-1))
        return redirect('rank:options',category.slug)
else:
    messages.error(request,"You have to login first to vote.")
    return redirect('rank:login')

options.html

<ol type="1">
          <center>{% bootstrap_messages %}</center>
    {% for option in options %}

     <div class="col-lg-6 col-md-6 mb-6">
              <div class="card h-100">
                <div class="card-body">
                    <b><li>
                  <img src="/media/{{option.image}}" width="400" height="300">
                 <h4>{{option.name}}
                  </h4>
                  <h5 class="card-text">{{ option.details}}</h5>
                      <h5>{{ option.votes }} votes</h5>
                       <form action="{% url 'rank:vote' option.slug %}" method="post">
                           {% csrf_token %}
                <input type="submit" class="btn btn-success" value="Vote" >
                       </form>
                         </li></b>
                </div>
                <div class="card-footer">
                  <small class="text-muted"></small>
                </div>


              </div>
                </div>
         {% empty %}
    <div class="card w-100">
    <div class="card-body">
        <h4>Item not available</h4>
    </div>
    </div>

    {% endfor %}
     </ol>

1 Ответ

0 голосов
/ 13 марта 2019

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

Например:

def options(request,slug):
    category = Category.objects.get(slug=slug)
    category.views += 1
    category.save()
    options = category.option_set.all().order_by('-votes')

    # Indicate whether the user has voted or not
    for option in options:
        option.has_voted = option.vote_set.filter(voter=request.user).exists()

    ...

    return render(request, 'rank/options.html', {'options': options,'form':form,'title': 'options','category':category})

И тогда вы можете проверить атрибут has_voted в шаблоне при рендеринге кнопки:

{% if option.has_voted %}
    You already voted
{% else %}
    <input type="submit" class="btn btn-success" value="Vote" >
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...