Найти - Пользователи
Полная версия: Не срабатывает кнопка в форме редактирования записи в БД
Начало » Django » Не срабатывает кнопка в форме редактирования записи в БД
1
Quasar63
Django 3.0.2

Коллеги, помогите!
Данные в форму подтягиваются, но по кнопке «Сохранить» сохранения изменений в БД не происходит.
Чую, что-то тут просто, но никак не получается. )
=========

view.py:
———
 from django.views.generic import View, TemplateView, ListView, DetailView
from django.views.generic.edit import UpdateView, DeleteView
class ProjectUpdate(UpdateView):
   model = Project
   model_form = ProjectForm
   fields = [name, description, assigner, datebegin, dateend]
   template_name = project_update.html
urls.py:
———
 path(projects_list/project_update/<int:pk>, views.ProjectUpdate.as_view(), name = project_update),

project_update.html:
———————
 {% block project %}
   <h1>Изменить проект</h1>
   <form method=»POST» class=»post-form» action=»»></form>
      {% csrf_token %}
      {{ form.as_p }}
      <button type=»submit» class=»save btn btn-primary»>Сохранить</button>
   </form>
{% endblock %}
FishHook
Quasar63
А что в Project и ProjectForm?
Quasar63
models.py:
 class Project(models.Model):
    name = models.CharField(max_length=64)
    description = models.TextField()
    datebegin = models.DateField()
    dateend = models.DateField()
    assigner = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='project_assigner')
    datecreate = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    def __str__(self):
          return (self.name + ' (' + self.datebegin.strftime('%d.%m.%Y') + ' - ' + self.dateend.strftime('%d.%m.%Y') + ')')

forms.py
 class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ['name', 'description', 'assigner', 'datebegin', 'dateend']

Ещё, по совету знатоков, убрал экшн из формы в шаблоне, model_form заменил на form_class и пришлось из вьюхи убрать

 fields = [name, description, assigner, datebegin, dateend],
т.к. вылезло: Specifying both ‘fields’ and ‘form_class’ is not permitted.

Но ничего не изменилось. (
FishHook
Quasar63
Могу только предположить, что ваша форма не валидируется, попробуйте методы form_valid и form_invalid
Quasar63
Похоже, форма даже не отсылается на сервер - в инспекторе кода в браузере полная тишина! Ни ошибок, ничего! Поэтому и до обработки form_invalid дело не доходит. (((
И, вообще, научите, как правильно отлаживать код в django? Может есть какие-то модули для логов и т.п.?
FishHook
Quasar63
Ну а что в отрендереной странице? Посмотрите в браузере исходник.

https://pypi.org/project/django-debug-toolbar/
Quasar63
 <body>    
    
    <h1>Изменить проект</h1>
    <form method="POST" class="post-form"></form>
        <input type="hidden" name="csrfmiddlewaretoken" value="75h0MQYsX6cc9dBI6UJ0WRYx25wpG8dz76LdLmS0KXGh27Rs1sdzXcHLwGIf2XDf">
        <p><label for="id_name">Name:</label> <input type="text" name="name" value="Проект №3" maxlength="64" required id="id_name"></p>
<p><label for="id_description">Description:</label> <textarea name="description" cols="40" rows="10" required id="id_description">
Это описание Проекта №3</textarea></p>
<p><label for="id_assigner">Assigner:</label> <select name="assigner" required id="id_assigner">
  <option value="">---------</option>
  <option value="1" selected>rolex</option>
  <option value="2">larimarit</option>
  <option value="3">larimar</option>
</select></p>
<p><label for="id_datebegin">Datebegin:</label> <input type="text" name="datebegin" value="31.01.2020" required id="id_datebegin"></p>
<p><label for="id_dateend">Dateend:</label> <input type="text" name="dateend" value="20.02.2020" required id="id_dateend"></p>
        <button type="submit">Сохранить</button>
    </form>
</body>
FishHook
Quasar63
 <h1>Изменить проект</h1>
    <form method="POST" class="post-form"></form> !!!!!!!!!!!!!!!
        <input type="hidden" name="csrfmiddlewaretoken" value="75h0MQYsX6cc9dBI6UJ0WRYx25wpG8dz76LdLmS0KXGh27Rs1sdzXcHLwGIf2XDf">
        <p><label for="id_name">Name:</label> <input type="text" name="name" value="Проект №3" maxlength="64" required id="id_name"></p>
<p><label for="id_description">Description:</label> <textarea name="description" cols="40" rows="10" required id="id_description">
Это описание Проекта №3</textarea></p>
<p><label for="id_assigner">Assigner:</label> <select name="assigner" required id="id_assigner">
  <option value="">---------</option>
  <option value="1" selected>rolex</option>
  <option value="2">larimarit</option>
  <option value="3">larimar</option>
</select></p>
<p><label for="id_datebegin">Datebegin:</label> <input type="text" name="datebegin" value="31.01.2020" required id="id_datebegin"></p>
<p><label for="id_dateend">Dateend:</label> <input type="text" name="dateend" value="20.02.2020" required id="id_dateend"></p>
        <button type="submit">Сохранить</button>
    </form>

А вас не смущает место помеченное как !!!!!!!!!
Ваша форма пустая. У вас открывающий тег и тут же закрывающий.
И я даже понял почему

  {% block project %}
   <h1>Изменить проект</h1>
   <form method=»POST» class=»post-form» action=»»></form>!!!!!!!
      {% csrf_token %}
      {{ form.as_p }}
      <button type=»submit» class=»save btn btn-primary»>Сохранить</button>
   </form>!!!!!
{% endblock %}

Зачем же вы тег закрываете два раза?
Quasar63
Ох, и нифига себе!!! ))) Обычно за мной такого не замечается! Спасибо!
Есть подозрение на автоподставу в VS Code, но это слабое оправдание!
Правда, тут у меня очередная неприятность - после установки дебагера не запускается сервер:
NameError: name ‘debug_toolbar’ is not defined
Всё, вроде, сделал по мануалу. Впрочем, глядя на мою form этого утверждать нельзя. )))
Quasar63
С дебагером разобрался - забыл импортнуть )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB