django данные в форме появляются только после обновления - PullRequest
0 голосов
/ 05 марта 2020

Я использую пользовательскую аутентификацию пользователя для проверки пользователя. У меня есть таблица с именем voter, и я добавляю имя пользователя и пароль с помощью from и сопоставляю ее с именем пользователя и паролем таблицы, если она совпадает, пользователь войдет в систему и разрешит им перейти на следующую страницу, содержащую форму. В этой форме я инициировал данные, но они не будут появляться автоматически, они появятся только тогда, когда я перефразирую sh код моих файлов на странице

ниже (для некоторых больших файлов включен только соответствующий код, поэтому частичное)

model.py (частичное)

    class Voter(models.Model):
        serial_voter_id = models.AutoField(primary_key=True)
        voter_id = models.CharField(unique=True, max_length=10)
        voter_name = models.CharField(max_length=255)
        voter_constituency = models.ForeignKey(Constituency, models.DO_NOTHING, blank=True, null=True)
        username = models.CharField(unique=True, max_length=32)
        password = models.TextField()
        voter_address = models.CharField(max_length=255, blank=True, null=True)
        area = models.CharField(max_length=10, blank=True, null=True)
        city = models.CharField(max_length=10, blank=True, null=True)
        pincode = models.IntegerField(blank=True, null=True)
        adhar_no = models.BigIntegerField(unique=True)
        birth_date = models.DateField()
        age = models.IntegerField()
        fingerprint = models.TextField(blank=True, null=True)
        authenticity = models.CharField(max_length=3, blank=True, null=True)
        wallet_id = models.TextField()

        class Meta:
            managed = False
            db_table = 'voter'

forms.py

from django import forms

from .models import Voter

class VoterForm(forms.ModelForm):
    class Meta:
        model = Voter
        fields = [
            'serial_voter_id',
            'voter_id',
            'voter_name',
            'voter_constituency',
            'username',
            'voter_address',
            'area',
            'city',
            'pincode',
            'adhar_no',
            'birth_date',
            'age',
            'authenticity',
            'wallet_id'
        ]

views.py (частичное)

from .models import Voter
from .forms import VoterForm

def voter_login(request, *args, **kwargs):
    contex = {}
    return render(request, "poll/voter_login.html", contex)


def voter_verification(request, *args, **kwargs):
    f_username = request.POST.get('username')
    voter = Voter.objects.get(voter_id=1) # thing need to be dynamic hear by replacing it with username
    f_username = request.POST.get('username')
    f_password = request.POST.get('password')
    u_password = voter.password # fetching the password from voter object
    u_password = u_password.decode() # decoding binary password to string
    form = VoterForm(request.POST or None, instance=voter)
    if form.is_valid():
        form.save()
        form = VoterForm()
    contex = {
        'voter' : voter,
        'f_username' : f_username,
        'f_password' : f_password,
        'u_password' : u_password,
        'form'       : form
    }
    # compare hear username and password entered by user and from database if these are correcgt then allow this view or redirect to voter_login view
    if voter.username == f_username and u_password == f_password:
        return render(request, "poll/voter_verification.html", contex)
    else:
        return render(request, "poll/voter_login.html", {})

voter_login. html

{% extends 'header.html' %}

{% block content %}
<table>
<form method="get" action='voter_verification'> {% csrf_token %}
    username <input type="text" name="username">
    password <input type="password" name="password">
    <input type="submit" name="login" value="login">
</form>
{% endblock %}

voter_verification. html (файл шаблона)

<!DOCTYPE html>
<html>
<body>

{% if f_username == voter.username and f_password == u_password %}
    <h1>verified</h1>
{% else %}
    <h1>wrong id and password</h1>
{% endif %}

<form method='post' action='vote_page'> {% csrf_token %}
    {{ form.as_p }}
    <input type='submit' value="sumbit">
</form>

</body>
</html>

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Спасибо DrMaxwellEdison от reddit за предоставление ответа https://www.reddit.com/r/djangolearning/comments/fecn1f/question_django_data_in_form_only_appear_after/

Пожалуйста, не используйте отдельную модель, в которой хранятся имена пользователей и пароли помимо вашей модели User. Вы можете просто добавить OneToOneField в модель User, чтобы подключить эту модель Voter к аутентифицированному пользователю, и вам не нужно делать никакого дополнительного хранения данных (плюс, вы, скорее всего, будете неправильно обрабатывать информацию о пароле, подвергая ее воздействию скомпрометирован, если ваш сайт взломан).

Также, согласно вашему комментарию к SO, POST не работает из-за защиты CSRF (отслеживание вашей ошибки, вероятно, уже указывало бы на это). Пожалуйста, обратитесь к этим документам для получения подробной информации о том, как действовать (подсказка: не отключайте CSRF!).

0 голосов
/ 05 марта 2020

изменяет запрос в модели представления (def voter_verification (request, * args, ** kwargs):)

def voter_verification(request, *args, **kwargs):
    f_username = request.POST.get('username')
    voter = Voter.objects.get(username=f_username)

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

...