A voting site with Django
----------------------------Model---------------------------------------- class Voter(models.Model): gender_type = (('male', 'Male'), ('female', 'Female')) admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE) gender = models.CharField(max_length=10, choices=gender_type) country_region = models.CharField(max_length=255, choices=Countries.choices, default=Countries.Pakistan) phone = PhoneNumberField(blank=True, unique=True) otp = models.CharField(max_length=10, null=True) verified = models.BooleanField(default=False) voted = models.BooleanField(default=False) otp_sent = models.IntegerField(default=0) # Control how many OTPs are sent ip_address = models.GenericIPAddressField(unique=True, default='ABC') def __str__(self): return self.admin.first_name class Position(models.Model): ACTIVE = 0 INACTIVE = 1 status_choice = ((ACTIVE, 'Active'), (INACTIVE, 'Inactive')) name = models.CharField(max_length=50, unique=True) max_vote = models.IntegerField() priority = models.IntegerField() description = models.TextField(null=True, blank=True) status = models.PositiveBigIntegerField(default=0, choices=status_choice) def __str__(self): return self.name class Candidate(models.Model): fullname = models.CharField(max_length=50) photo = models.ImageField(upload_to="candidates") bio = models.TextField() position = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='candidates') def __str__(self): return self.fullname def modify_points(self, added_points): self.points += added_points self.save() class Votes(models.Model): voter = models.ForeignKey(Voter, on_delete=models.CASCADE) position = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='positions') candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name='votes') class BlockIP(models.Model): voter = models.ForeignKey(Voter, on_delete=models.CASCADE, related_name='ip') position = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='positions_ip', null=True, blank=True) ip_address = models.GenericIPAddressField(default='abc') @receiver(post_save, sender=Voter) def default_to_non_active(sender, instance, created, **kwargs): if created: instance = BlockIP.objects.create(voter=instance, ip_address=instance.ip_address) instance.save() -------------------------------------------- End of model----------------------------------- def submit_ballot(request): if not request.user.is_authenticated: return redirect(reverse('index')) if request.method != 'POST': messages.error(request, "Please, browse the system properly") return redirect(reverse('index')) # Verify if the voter has voted or not voter = request.user.voter blocked = BlockIP.objects.filter(voter=voter) if voter.voted and blocked: messages.error(request, "You have voted already") return redirect(reverse('index')) form = dict(request.POST) form.pop('csrfmiddlewaretoken', None) # Pop CSRF Token form.pop('submit_vote', None) # Pop Submit Button # Ensure at least one vote is selected if len(form.keys()) < 1: messages.error(request, "Please select at least one candidate") return redirect(reverse('index')) positions = Position.objects.all() form_count = 0 for position in positions: max_vote = position.max_vote pos = slugify(position.name) pos_id = position.id if position.max_vote > 1: this_key = pos + "[]" form_position = form.get(this_key) if form_position is None: continue if len(form_position) > max_vote: messages.error(request, "You can only choose " + str(max_vote) + " candidates for " + position.name) return redirect(reverse('index')) else: for form_candidate_id in form_position: form_count += 1 try: candidate = Candidate.objects.get(id=form_candidate_id, position=position) vote = Votes() vote.candidate = candidate vote.voter = voter vote.position = position vote.save() except Exception as e: messages.error( request, "Please, browse the system properly " + str(e)) return redirect(reverse('index')) else: this_key = pos form_position = form.get(this_key) if form_position is None: continue # Max Vote == 1 form_count += 1 try: form_position = form_position[0] candidate = Candidate.objects.get(position=position, id=form_position) vote = Votes() vote.candidate = candidate vote.voter = voter vote.position = position vote.save() except Exception as e: messages.error( request, "Please, browse the system properly " + str(e)) return redirect(reverse('index')) # Count total number of records inserted # Check it viz-a-viz form_count inserted_votes = Votes.objects.filter(voter=voter) if (inserted_votes.count() != form_count): # Delete inserted_votes.delete() messages.error(request, "Please try voting again!") return redirect(reverse('index')) else: # Update Voter profile to voted voter.voted = True voter.save() messages.success(request, "Thanks for voting") return redirect(reverse('index'))
When a poll is create, and a candidate is added to that poll, a voter can vote any candidate, my problem now is if a voter already voted, that voter cannot vote again even when another poll is created, what i want is a voter can still vote in another poll regardless of voting on a poll already
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
AD
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
m
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
m
- molni99
- Қаз. 26, 2024, 1:29 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:20ұпай,
- Бағалау ұпайлары-10
Соңғы пікірлер
ИМ
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
IscanderCheҚаз. 31, 2024, 3:43 Т.Қ.