Джанго редактировать форму - PullRequest
0 голосов
/ 24 июня 2018

Я использую Django v1.11.8 и Python 2.7.6

У меня возник вопрос по поводу формы редактирования.Может кто-нибудь объяснить мне, как написать правильную форму редактирования в Django?Я работаю целый день и у меня все еще есть проблемы ... Я видел много примеров в Интернете, но я все еще делаю что-то не так.

Моя ModelForm выглядит так:

class UpdateVoteForm(ModelForm):
    class Meta:
        model = Vote
        fields = ['question', 'ans_a', 'ans_b', 'ans_c', 'ans_d', 'ans_e', 'ans_f', 'type', 'council', 'user', 'created_date', 'group']

viewФункция:

def update_vote_from(request, pk):
    vote_inst = get_object_or_404(Vote, pk = pk)
    if request.method == 'POST':

        form = UpdateVoteForm(request.POST, instance=vote_inst)
        if form.is_valid():
            #vote_inst = form.save(commit=False)
            #vote_inst.created_date = datetime.date.today()
            form.save()

            return HttpResponseRedirect(reverse('voting-list'))

    else:
        form = UpdateVoteForm()

    return render(request, 'votes-form.html', {'form': form, 'vote_inst': vote_inst})

URL:

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^votersList/$', views.VotersView.as_view(), name='voters-list'), 
    url(r'^vote/create/$', views.add_vote_from, name='vote-create'),
    url(r'^vote/(?P<pk>\d+)/edit/$', views.update_vote_from, name='vote-update'),     
]

и шаблон:

{% extends "base_generic.html" %}

{% block content %}

<div class="containter">
<form action="" method="post">
    {% csrf_token %}

<label for="user">Właściciel: </label>
    <select id="user" name="user">
        {% for user in vote_inst.user.all %}
            <option value="{{ user }}"{% if vote_inst.user == user %} selected{% endif %}>{{ user }}</option>
        {% endfor %}
    </select>

    <label for="user">Kto: </label>
    <input id="user" type="text" name="user" value="{{ vote_inst.user }}">

    <label for="question">Pytanie: </label>
    <textarea id="question" name="question" style="height:70px" value="{{ vote_inst.question.value }}"></textarea>

    <label for="ans_a">Odpowiedź A: </label>
    <input id="ans_a" type="text" name="ans_a" placeholder="Wpisz odpowiedź A" value="{{ vote_inst.ans_a }}">

    <label for="ans_b">Odpowiedź B: </label>
    <input id="ans_b" type="text" name="ans_b" value="{{ vote_inst.ans_b }}">

    <label for="ans_c">Odpowiedź C: </label>
    <input id="ans_c" type="text" name="ans_c" value="{{ vote_inst.ans_c }}">

    <label for="ans_d">Odpowiedź D: </label>
    <input id="ans_d" type="text" name="ans_d" value="{{ vote_inst.ans_d }}">

    <label for="ans_e">Odpowiedź E: </label>
    <input id="ans_e" type="text" name="ans_e" value="{{ vote_inst.ans_e }}">

    <label for="ans_f">Odpowiedź F: </label>
    <input id="ans_f" type="text" name="ans_f" value="{{ vote_inst.ans_f }}">

    <label for="type">Typ głosowania: </label>
    <select id="type" name="type">
        {% for x,y in vote_inst.type_choices %}
            <option value="{{ x }}"{% if vote_inst.type == x %} selected{% endif %}>{{ y }}</option>
        {% endfor %}
    </select>    
    <input type="submit" value="Zatwierdź" />


</form>
</div>

{% endblock %}

Модель:

class Vote(models.Model):

    STATUS_INACTIVE = 0
    STATUS_ACTIVE_NOW = 1
    STATUS_FINISHED = 2
    STATUS_DELETED = 3

    TYPE_UNDECLARED = 0
    TYPE_PUBLIC = 1
    TYPE_NONPUBLIC = 2

    NO_RESULT = 0
    RESULT_A = 1
    RESULT_B = 2
    RESULT_C = 3
    RESULT_D = 4
    RESULT_E = 5
    RESULT_F = 6

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    voted_list = models.ManyToManyField(
        Voter,
        through='Voted',
        #through_fields=('Vote', 'Voter'),
    )
    council = models.ForeignKey(Council, on_delete=models.CASCADE)
    type_choices = (
        (TYPE_PUBLIC, 'Jawne'),
        (TYPE_NONPUBLIC, 'Niejawne'),
    )
    type = models.IntegerField(choices=type_choices, default=TYPE_PUBLIC)
    status_choices = (
        (STATUS_INACTIVE, 'Nieaktywne'),
        (STATUS_ACTIVE_NOW, 'Aktywne'),
        (STATUS_FINISHED, 'Zakończone'),
    )
    status = models.IntegerField(choices=status_choices, default=STATUS_INACTIVE)
    question = models.TextField()
    ans_a = models.TextField(null=True, blank=True)
    ans_b = models.TextField(null=True, blank=True)
    ans_c = models.TextField(null=True, blank=True)
    ans_d = models.TextField(null=True, blank=True)
    ans_e = models.TextField(null=True, blank=True)
    ans_f = models.TextField(null=True, blank=True)
    result_choices = (
        (NO_RESULT, 'No result'),
        (RESULT_A, 'A'),
        (RESULT_B, 'B'),
        (RESULT_C, 'C'),
        (RESULT_D, 'D'),
        (RESULT_E, 'E'),
        (RESULT_F, 'F'),
    )
    result = models.IntegerField(choices=result_choices, default=NO_RESULT)
    begin_date = models.DateTimeField(null=True, blank=True)
    finish_date = models.DateTimeField(null=True, blank=True)
    created_date = models.DateTimeField(default=timezone.now)

    def get_status(self):
        return self.status_choices[self.status][1]

    def get_absolute_url(self):
        return reverse('vote-update', args=[str(self.id)])

    def __unicode__(self):
        return "%s" % self.question

class User(models.Model):
    STATUS_INACTIVE = 0
    STATUS_ACTIVE = 1
    STATUS_DELETED = 2

    PRIVILIGES_UNDECLARED = 0
    PRIVILIGES_ADMIN = 1
    PRIVILIGES_MANAGER = 2
    PRIVILIGES_REPORTER = 3

    forename = models.CharField(max_length=50)
    name = models.CharField(max_length=50)
    login = models.CharField(max_length=30)
    password = models.CharField(max_length=50)
    last_login = models.DateTimeField(null=True, blank=True)
    priviliges_choices = (
        (PRIVILIGES_UNDECLARED ,'Undeclared'),
        (PRIVILIGES_ADMIN      ,'Administrator'),
        (PRIVILIGES_MANAGER    ,'Voting Manager'),
        (PRIVILIGES_REPORTER   ,'Reporter'),
    )
    priviligies = models.IntegerField(choices=priviliges_choices, default=PRIVILIGES_UNDECLARED)
    status_choices = (
        (STATUS_INACTIVE ,'Inactive'),
        (STATUS_ACTIVE   ,'Active'),
        (STATUS_DELETED  ,'Deleted'),
    )
    status = models.IntegerField(choices=status_choices, default=STATUS_INACTIVE)

    def get_absolute_url(self):
        return reverse('user-detail', args=[str(self.id)])

    def __unicode__(self):
        return "%s: %s %s" % (self.login, self.forename, self.name)

ЕстьНесколько вещей:

  1. текстовая область не заполнена при попытке отредактировать какой-либо экземпляр Голосования
  2. Список выбора пуст, я думаю, что мой цикл "для" плох.
  3. Кнопка отправки ничего не делает ... из-за того, что form.is_valid () возвращает 0.
  4. Я думаю, что я делаю неправильно, не используя модель пользователей Django, как вы думаете?
  5. Если вы видите какое-либо плохое поведение при кодировании, дайте мне знать.
  6. Должен ли я остаться с Python 2.7 и Django 1.11?Я чувствую себя лучше с Py2.7, но если это вызовет больше проблем в будущем, я могу изменить его.

1 Ответ

0 голосов
/ 24 июня 2018

Вы не должны делать ничего из этого.Большинство ваших проблем вызвано попыткой вывести поля формы самостоятельно, вместо того, чтобы позволить Django сделать это.Удалите все это и либо просто используйте {{ form.as_p }}, либо переберите поля формы и выведите каждое из них:

{{ form.user.label_tag }}
{{ form.user }}
{{ form.user.errors }}
...