Не загружаются данные в форму с первого раза
Всем доброго времени суток.
Проблема такая: у меня есть несколько одинаковых форм с разными initial. И при открытии этой странички, только у первой формы отсутствует initial(то есть все ее поля пустые). А
при повторном открытии странички, у всех форм есть initial,и все работает корректно.
Схема работы такая: path -> CheckEditForm -> EditForm
Views.py:
class CheckEditForm(TemplateView):
# если пользователь авторизован, то показывать ему форму, иначе отправлять его на авторизацию
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated:
# return self.get(request)
return EditForm.as_view
else:
return redirect("LoginForm")
class EditForm(ListView, FormView):
model = Marker
template_name = 'map/edit.html'
form_class = MarkerForm
def get_queryset(self):
# делаю словарь типа {' имя пользователя': ['все его формы'...]}
objects = {}
user = self.request.user
# user = authenticate(username=data['username'], password=data['password'])
markers = Marker.objects.filter(who=user.pk)
objects[user.username] = []
for marker in markers:
f = self.get_form(MarkerForm) #ошибка????
for key in f.declared_fields.keys():
f.declared_fields[key].initial = getattr(marker, key) присваиваю форме начальные значения
print(f.declared_fields[key].initial)
objects[user.username].append(f)
return objects.items()
forms.py
class MarkerForm(forms.Form):
longitude = forms.FloatField()
latitude = forms.FloatField()
location = forms.CharField(max_length=80)
type = forms.ChoiceField(choices=Marker.TYPE)
status = forms.BooleanField()
date_of_update = forms.DateTimeField()
html template
{% extends 'map/base.html' %}
{% block body %}
<ul>
<!-- Iterate over object_list -->
{% for key, values in object_list %}
<!-- Display Objects -->
<h1>{{ key }}</h1>
{% for value in values %}
<form action="POST">
{{ value.as_p }}
<input type="submit" value="Save">
</form>
<hr/>
{% endfor %}
<!-- If object_list is empty -->
{% empty %}
<li>No objects yet.</li>
{% endfor %}
</ul>
{% endblock %}
Пробовал переделать класс при помощи этого вопроса. Но результат одинаковый. Я думаю, все дело в неправильном создании экземпляров класса MarkerForm. (Строку пометил)
Я так и не понял, с чем это связано, но проблему решил.
Я просто перенес присвоение initial в init формы. Вот так получилось:
views
class EditForm(ListView, FormView):
model = Marker
template_name = 'map/edit.html'
form_class = MarkerForm
def get_queryset(self):
objects = {}
user = self.request.user
# user = authenticate(username=data['username'], password=data['password'])
markers = Marker.objects.filter(who=user.pk)
objects[user.username] = []
for marker in markers:
data = {}
for key in MarkerForm.declared_fields.keys():
data[key] = getattr(marker, key)
f = MarkerForm(initials=data)
objects[user.username].append(f)
forms
class MarkerForm(forms.Form):
def __init__(self, *args, **kwargs):
if kwargs.get('initials'):
for key in self.declared_fields.keys():
self.declared_fields[key].initial = kwargs['initials'][key]
del kwargs['initials']
super(MarkerForm, self).__init__(*args, **kwargs)
longitude = forms.FloatField()
latitude = forms.FloatField()
location = forms.CharField(max_length=80)
type = forms.ChoiceField(choices=Marker.TYPE)
status = forms.BooleanField()
date_of_update = forms.DateTimeField()
Вопрос не закрыт, т.к. причина возникновения проблемы неизвестна. Жду ваших предположений по этому вопросу.