2013-10-13 4 views
8

Я пытаюсь разрешить пользователям создавать и редактировать свои профили после их регистрации. Я использую модельную форму. Мне нужно, чтобы поле модели работодателя заполнялось текущим пользователем.Как обновить существующий профиль Django Model Form

Вот мое мнение:

def update_profile(request, username): 
    if request.method == 'POST': 
     edit_profile_form=EditProfileForm(request.POST) 
     if edit_profile_form.is_valid(): 
      editprofile = edit_profile_form.save(commit=False) 
      editprofile.employer = request.user.get_profile() 
      editprofile.save() 
    edit_profile_form = EditProfileForm() 
    context = {'edit_profile_form':edit_profile_form,} 
    return render(request, 'pandaboard/editprofile.html', context) 

Вот моя модель:

class Profile(models.Model): 
    employer = models.ForeignKey(User) 
    company_name = models.CharField(max_length=100) 
    company_description = models.TextField() 
    company_website = models.URLField(max_length=200, blank=True) 
    contact_email = models.EmailField(max_length=100) 
    contact_name = models.CharField(max_length=100) 
    def __unicode__(self): 
     return self.company_name 

Вот моя модель Форма

from django.forms import ModelForm 
from pandaboard.models import JobPost, Profile 
from django.contrib.auth.models import User 

class EditProfileForm(ModelForm): 
    class Meta: 
     model = Profile 
     fields = ['company_name','company_description','company_website','contact_email','contact_name'] 
+0

Является ли 'EditProfileForm' ModelForm для профиля? Отправьте свой класс формы. – Brandon

+0

ОК Я добавил свою модельную форму –

+0

При обновлении модели, как правило, вы передадите свою модель форме экземпляра модели, чтобы предварительно заполнить форму существующими данными из модели. Это то, что вам нужно делать? или вы не хотите этого делать, и вместо этого нужно вводить текущего пользователя в форму? – Brandon

ответ

9

Для гидратов формы со значениями из существующего экземпляра модели, вам нужно использовать instance аргумент в типовой форме:

def update_profile(request, username): 
    profile = request.user.get_profile() 
    edit_profile_form = EditProfileForm(request.POST or None, 
     current_user=request.user, instance=profile) 

    if request.method == 'POST': 
     if edit_profile_form.is_valid(): 
      editprofile.save() 

    context = {'edit_profile_form': edit_profile_form} 
    return render(request, 'pandaboard/editprofile.html', context) 

Чтобы придать текущий request.user, вы можете переопределить __init__ из EditProfileForm, проходя дополнительный аргумент ключевого слова (или аргумент, это не имеет значения), и хлопать его из kwargs перед вызовом супер, так что вы не проходя мимо ModelForm ключевого слова аргумента он не ожидает:

class EditProfileForm(ModelForm): 
    class Meta: 
     model = Profile 

    def __init__(self, *args, **kwargs): 
     current_user = kwargs.pop('current_user') 
     super(EditProfileForm, self).__init__(*args, **kwargs) 
     self.fields['employer'] = current_user 

Теперь вам не нужно проходить commit=False и вручную установить значение employer на вид.

+0

Я получаю следующую ошибку: Невозможно разрешить использование ключевого слова 'пользователь' в поле. Возможны следующие варианты: company_description, company_name, company_website, contact_email, имя_пользователя, работодатель, id, jobpost. Нужно ли иметь поле работодателя, фактически называемое пользователем? –

+0

Не могли бы вы разместить Gist вашего modedied кода? – Brandon

+0

https://github.com/realseanp/jobboard –

Смежные вопросы