Django ModelForm не сохраняет данные в базу данных
Новичок в Django, у которого много проблем с работой форм. Да я'мы много работали над учебником и просматривали веб-страницы - у меня есть смесь того, что яНахожу здесь и на других сайтах. Я'используя Python 2.7 и Django 1.5. (хотя официальная документация обширна, предполагается, что вы уже знаете большую ее часть - не очень хорошо для начинающих или даже для продвинутого учебника)
Я пытаюсь создать форму дляпродлен» данные пользователя - например. название компании, почтовый адрес и т. д., но данные формы не сохраняются в базе данных.
Изначально я пытался создать модель, расширяющую стандартUser
модель, но я отказался от этого - слишком много нужно было изменить, и это становилось все более и более серьезным, что было далеко от меня на этом этапе. Поэтому вместо этого я создал новую модель под названием:UserProfile
class UserProfile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True)
company = models.CharField(max_length=50, blank=True)
address1 = models.CharField(max_length=50, blank=True)
address2 = models.CharField(max_length=50, blank=True)
city = models.CharField(max_length=20, blank=True)
region = models.CharField(max_length=20, blank=True)
postcode = models.CharField(max_length=10, blank=True)
country = models.CharField(max_length=20, blank=True)
phone = models.CharField(max_length=30, blank = True)
Я видел разные ссылки в Интернете о том, должен ли я ссылаться на модель пользователя сForeignKey
(как указано выше) или с OneToOne.
Я пытаюсь использовать ModelForm (оставьте его простым для того, что должно быть простой формой). Вот мой forms.py
from django.forms import ModelForm
from .models import UserProfile
class UserDetailsForm(ModelForm):
class Meta:
model = UserProfile
fields = ['company','address1','address2','city','region', 'postcode','country','phone']
Вот мой взгляд:
def UserDetailsView(request):
#f = 0
if request.method == 'POST':
f = UserDetailsForm(request.POST, instance = request.user)
if f.is_valid():
f.save()
else:
f = UserDetailsForm(request.POST , instance = request.user)
print "UserDetails objects: ", (UserProfile.objects.all())
return render_to_response('plagweb/console/profile.html',
{ 'form': f},
context_instance=RequestContext(request))
(да, есть несоответствие в UserProfile против UserDetail - это продукт всех моих взломов и будет исправлен, как только я его заработаю)
Диагностика шоуf.is_valid()
возвращая True. Аналогично, диагностическое шоуUserProfile.objects.all()
как пустой Я попробовал это в представлении выше после save (), а также в консоли Django.
Вот мой шаблон:
{{ form }}
{% csrf_token %}
На данный момент основная проблема заключается в том, что данные формы не сохраняются в базе данных. Я не знаю, читается ли еще или нет (как только у меня есть некоторые данные в базе данных ...)
Одна мысль состоит в том, чтоUser
отношения могут быть причиной проблемы?
Дополнения, следующие из Даниэля Роземанаs полезный комментарий / помощь:
Теперь форма сохраняется правильно (подтверждено диагностикой и проверками командной строки. Однако, когда я возвращаюсь к форме, она не отображает существующие данные. Отображается форма с пустыми полями данных. Насколько я могу судить, я 'м, передавая данные экземпляра правильно.
Есть ли параметр ModelForm, который нужно изменить?
Вот'Видоизмененный вид:
def UserDetailsView(request):
#print "request co:", request.user.profile.company
f = UserDetailsForm(request.POST, instance = request.user.profile )
if request.method == 'POST':
if f.is_valid():
profile = f.save(commit=False)
profile.user = request.user
profile.save()
return render_to_response('plagweb/console/profile.html',
{ 'form': f},
context_instance=RequestContext(request))
Диагностика показывает, чтоrequest.user.profile
установлен правильно (в частности, поле компании). Однако форма отображается с пустыми полями. Источник HTML неНе показывать любые значения данных, либо. В качестве дополнительной проверки я также попробовал некоторые шаблоны диагностики:
{% for field in form%}
{{field.label}}
{{field.value}}
{% endfor%}
Это правильно перечисляет метки полей, но все значения отображаются как.None
Для полноты, UserProfile 'Пользовательское поле теперь определено какuser = models.OneToOneField(settings.AUTH_USER_MODEL)
и лямбда-выражение User.profile не изменяется.