2013-10-13 17 views
8

ユーザーは、登録したプロファイルを作成して編集できるようにしようとしています。私はモデルフォームを使用しています。私がする必要があるのは、雇用者モデルのフィールドを現在のユーザーで埋めることです。ここで既存のプロファイルを更新する方法Djangoモデルのフォーム

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'はProfile用のModelFormですか?フォームクラスを投稿してください。 – Brandon

+0

Okモデルフォームを追加しました –

+0

モデルを更新するときは、通常、モデルフォームをモデルのインスタンスに渡して、モデルの既存のデータでフォームをあらかじめ入力します。それはあなたがする必要があるのですか?それをやりたくないのですか?代わりに、現在のユーザーをフォームに挿入する必要がありますか? – Brandon

答えて

9
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のオーバーライドすることができます:は、既存のモデルインスタンスから値を使用して、フォームを水和するためには、モデルのフォームにinstance引数を使用する必要があります余分なキーワード引数(またはargが、それは本当に問題ではありません)、あなたはのModelFormにキーワード引数を渡していないので、それが期待されていないスーパーを呼び出す前にkwargsから外に飛び出る:

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を渡す必要はなく、手動で値0を設定してくださいビュー内の。

+0

次のエラーが表示されます。 キーワード 'user'をフィールドに解決できません。選択肢は、company_description、company_name、company_website、contact_email、contact_name、employer、id、jobpostです。雇用者フィールドを実際にuserと呼ぶ必要がありますか? –

+0

あなたの変更されたコードの要点を投稿できますか? – Brandon

+0

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

関連する問題