2016-12-10 7 views
0

Я пытаюсь создать профиль пользователя для своих пользователей с Django. В целом, похоже, в основном работал, и я могу видеть все правильно на странице администратора. На моей фактической странице HTML я правильно вижу поля модели, которые мне нужны, однако они не заполнены никакими данными, и данные, которые я вставляю, фактически не будут экономить, даже если говорят, что это так.Почему в представлении Django отображаются правильные поля модели без данных?

views.py

class DemoUserEditView(UpdateView): 
    form_class = DemoUserEditForm 
    template_name = "user/profile.html" 
    view_name = 'account_profile' 
    success_url = '/member/' 

    def get_object(self): 
     return self.request.user 

    def form_valid(self, form): 
     form.save() 
     messages.add_message(self.request, messages.INFO, 'User profile updated') 
     return super(DemoUserEditView, self).form_valid(form) 


account_profile = login_required(DemoUserEditView.as_view()) 

models.py.

class UserProfile(models.Model): 

    user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) 
    avatar_url = models.CharField(max_length=256, blank=True, null=True) 

    skills = models.CharField(max_length=256, blank=True, null=True) 



    avatarpic = models.ImageField(_('avatar photo'), 
    blank=True, null=True, 
    upload_to=user_directory_path, validators=[validate_img_extension]) 

    Bio = models.TextField(_('Bio'), 
    max_length=200, blank=True, null=True, unique=False) 

    EDUCATION_CHOICES = (
    ('0', "Didn't complete High School"), 
    ('1', 'High School or GED'), 
    ('2', 'Associate Degree'), 
    ('3', 'Batchlors Degree'), 
    ('4', 'Masters Degree'), 
    ('5', 'PhD Degree'), 
    ('6', 'Professional Degree'), 
    ) 

    Education = models.CharField(_('Education'), 
    max_length=100, blank=True, null=False, 
    choices=EDUCATION_CHOICES, unique=False, 
    help_text="Level of Education") 

urls.py

url(r'^accounts/', include('allauth.urls')), 
url(r'^accounts/profile/$', 'base.views.account_profile', name='account_profile'),  

Я пытаюсь использовать общие взгляды, и я думал, что UpdateView будет соответствующий тег для этого. Я прочитал Generic View docs, а также несколько вопросов о стекопотоке и this one. Моя большая проблема заключается в том, что я больше не получаю сообщений об ошибках, и он говорит, что форма действительна и сохраняется, но это не так, и я не уверен, что еще попробовать.

Итак, как я могу заполнить форму модели существующими пользовательскими данными?

ответ

0

Как написано here

UpdateView хочет показать форму уже заполнены значениями, так это экземпляров self.object перед обработкой запроса. Это делает объект доступным в словаре ключевых слов под ключом экземпляра, , который используется modelforms для инициализации данных.

Для меня это означает, что:

def get_object(self): 
    return self.request.user 

не возвращает объект пользователя, который требуется для формы. Можете ли вы просить проверить, нет ли этого?

Edit 1: Я сделал местный тест и после переопределения формы get_form данных был загружен в форму:

def get_form(self, form_class=None): 

    user = self.request.user 
    profile = get_user_profile(self.request.user) 
    user_initial = {'username': user.username, 
        'first_name': user.first_name, 
        'last_name': user.last_name, 
        'email': user.email, 
        'phone': profile.phone} 

    form = ProfileForm(initial=user_initial, instance=profile) 
    return form 

Как вы можете видеть в get_form вы можете создать свою форму и предоставить исходные данные, а также как пример.

+0

Команда self.request.user возвращает правильную строку пользователя. Я все еще думаю, что это комедия, где ошибка, хотя, я просто не уверен, что еще нужно вернуть. – RknRobin

+0

ok, попробуйте сделать так, чтобы def get_object (self, queryset = None): –

+0

Хорошо, теперь мы куда-то попадаем. Добавление запроса = ничего не было ... ничего! Это показано [здесь] (https://ccbv.co.uk/projects/Django/1.4/django.views.generic.edit/UpdateView/), но это связано с тем, что queryset = None является значением по умолчанию и необходимо задать запрос внутри get_object. Я добавил queryset = UserProfile.objects.all(), но он не исправил интерфейс. – RknRobin