2013-10-13 29 views
8

Kullanıcıların, kayıt olduktan sonra profillerini oluşturabilmelerini ve düzenleyebilmelerini sağlamaya çalışıyorum. Bir model formu kullanıyorum. Yapmam gereken şey, işveren modeli alanının mevcut kullanıcıyla doldurulmasıdır. İşteMevcut Profil Nasıl Güncelleştirilir? Django Model Formu

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) 

benim modelidir:: İşte

benim görünümüdür İşte

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 

benim Modeli Formu

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' bir ProfileForm için Profil mi? Lütfen form sınıfınızı gönderin. – Brandon

+0

Tamam Model formumu ekledim –

+0

Bir modeli güncelleştirirken, genellikle modeli modelden varolan verilerle önceden doldurmak için modelin bir örneğini form vereceksiniz. Yapman gereken şey bu mu? ya da bunu yapmak istemiyorsunuz ve bunun yerine mevcut kullanıcıyı forma enjekte etmeniz gerekiyor mu? – Brandon

cevap

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) 

akım request.user enjekte etmek için geçen, __init__EditProfileForm ait geçersiz kılabilirsiniz:mevcut modelin örneğinden değerlerle Formunuzu nemlendirmek için, model formu üzerinde instance argüman kullanmak gerekir ilave anahtar kelime argümanı (veya Argo, gerçekten önemli değil) ve ModelForm bir anahtar kelime argüman geçmezken bu yüzden beklemiyordum olan süper çağırmadan önce kwargs dışarı haşhaş:

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 

Artık commit=False'u geçmek zorunda değilsiniz ve 0 değerini manuel olarak ayarlamalısınız.görünümünde.

+0

Aşağıdaki hatayı alıyorum: 'Kullanıcı' anahtar sözcüğü alana dönüştürülemiyor. Seçenekler şunlardır: company_description, company_name, company_website, contact_email, contact_name, işveren, kimlik, jobpost İşveren alanın aslında kullanıcı olarak adlandırılmasına ihtiyacım var mı? –

+0

Lütfen modifiye kodunuzun bir Gencini gönderir misiniz? – Brandon

+0

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