2014-01-07 49 views
0

我對Django以及Python都很陌生。我正在嘗試構建一個小型資源管理工具。下面是我到現在爲止提出的。 我擴展了用戶模型 我創建了其他所需的模型,例如當前地址永久地址等。 我在forms.py中有一個示例窗體 我有一個profile.html頁面。Python Django - 登錄後獲取用戶配置文件的表單數據(多個表單)

截至目前,當用戶登錄時,當他點擊更新配置文件時,他被重定向到Profile.html頁面,他從ModelForm Employee(從數據庫拉出的數據)獲取字段,該數據只是擴展的userModel。 (Infact用戶不應該能夠編輯這個表單中的任何字段,這應該只是一個只讀字段,因爲這將由Admin設置,但是這個問題對我來說是後來的一部分,我不知道如何將它作爲一個ReadOnly字段還沒有研究過)

我想要做的是現在我想要顯示所有其他形式也(當前地址,永久地址等模型在同一頁上的特定用戶,所以他可以更新記錄)直到現在我嘗試了不同的方法,但我無法得到任何適當的解決方案任何人都可以幫助我做到這一點。以下是我的模型,視圖,表單和html頁面。我願意爲任何替代解決方案提供便利和安全的解決方案,因爲我最近已經開始這麼做了,所以我可以改變任何需要更改的內容。所有其他模型都鏈接到來自Employee模型的外鍵Key_id。對長期問題表示歉意,但我被困在這一點,我無法從這一點開始。

形式:

#User Profile Form to update the user profile 
    class UserProfileForm(forms.ModelForm): 
      def __init__(self, *args, **kwargs): 
      super(UserProfileForm, self).__init__(*args, **kwargs) 

    # If you pass FormHelper constructor a form instance 
    # It builds a default layout with all its fields 
      self.helper = FormHelper(self) 

    # You can dynamically adjust your layout 
      helper = FormHelper() 
      helper.form_class = 'form-horizontal' 
      helper.layout = Layout(
       Field('text_input', css_class='input-xlarge'), 
       Field('textarea', rows="3", css_class='input-xlarge'), 
       'radio_buttons', 
       Field('checkboxes', style="background: #FAFAFA; padding: 10px;"), 
       AppendedText('appended_text', '.00'), 
       PrependedText('prepended_text', '<input type="checkbox"   checked="checked" value="" id="" name="">', active=True), 
       PrependedText('prepended_text_two', '@'), 
     'multicolon_select', 
       FormActions(
        Submit('save_changes', 'Save changes', css_class="btn-primary"), 
        Submit('cancel', 'Cancel'), 
       ) 
      ) 
      self.helper.layout.append(Submit('save_changes', 'Update')) 



     class Meta: 
      model = Employee 
      exclude = ('user',) 

瀏覽:

@login_required 
    def user_profile(request): 
     if request.method == 'POST': 
      form = UserProfileForm(request.POST, instance=request.user.profile) 

      if form.is_valid(): 
       form.save() 
       return HttpResponseRedirect('/accounts/loggedin/') 
     else: 
      user = request.user 
      profile = user.profile 
      form = UserProfileForm(instance=profile) 

     args = {} 
     args.update(csrf(request)) 
     args['form'] = form 
     return render_to_response('profile.html', args) 

profile.html:

 {% extends "base.html" %} 

    {% load crispy_forms_tags %} 
    {% block content %} 

     <h2> Profile </h2> 

     {% crispy form %} 

     {% endblock %} 

模型。

#Department Model 
class Dept(models.Model): 
dept_name = models.CharField(max_length=30) 
def __unicode__(self): 
    return self.dept_name 
#Extending User Model 
class Employee(models.Model): 
user = models.OneToOneField(User, null=True, blank = True, verbose_name="User Id") 
emp_id = models.IntegerField(primary_key=True, max_length=5, verbose_name="Employee Id") 
emp_first = models.CharField('First Name',max_length=20) 
emp_middle = models.CharField('Middle Name', blank=True, max_length=20) 
emp_last = models.CharField('Last Name',max_length=20) 
emp_email = models.EmailField('Email Id') 
emp_dept = models.ForeignKey(Dept, verbose_name="Department") 

def __unicode__(self): 
    return self.emp_first 

User.profile = property(lambda u: Employee.objects.get_or_create(user=u)[0]) 

#Current Address Model 
class CurrentContact(models.Model): 
emp = models.ForeignKey(Employee) 
emp_add = models.TextField('Current Address') 
emp_city = models.CharField('City', max_length=20, default = 'Bangalore') 
emp_state = models.CharField('State', max_length=20, default= 'Karnataka') 
emp_country = models.CharField('Country', max_length=20, default = 'India') 
emp_mobile1 = models.IntegerField('Mobile1',max_length=12) 
emp_mobile2 = models.IntegerField('Mobile2', null=True, blank=True, max_length=12) 
emp_landline = models.IntegerField('Land Line',null=True, blank=True, max_length=12) 
emp_PerEmail = models.EmailField('Personal Email Id', blank=True) 

def __unicode__(self): 
    return self.emp 

#Permanent Address Model 
class PermanentContact(models.Model): 
emp = models.ForeignKey(Employee) 
emp_add = models.TextField('Permanent Address') 
emp_city = models.CharField('City', max_length=20, default = 'Bangalore') 
emp_state = models.CharField('State', max_length=20,default= 'Karnataka') 
emp_country = models.CharField('Country', max_length=20, default = 'India') 
emp_mobile1 = models.IntegerField('Mobile1',max_length=12) 
emp_mobile2 = models.IntegerField('Mobile2', null=True, blank=True, max_length=12) 
emp_landline = models.IntegerField('Land Line',null=True, blank=True, max_length=12) 
emp_PerEmail = models.EmailField('Personal Email Id', blank=True) 

def __unicode__(self): 
    return self.emp 
#Emergency Contact Model 
class Emergency(models.Model): 
emp = models.ForeignKey(Employee) 
emrg_name = models.CharField('Full Name', max_length=30) 
emrg_add = models.TextField('Full Address') 
emrg_city = models.CharField('City', max_length=20, default = 'Bangalore') 
emrg_state = models.CharField('State', max_length=20,default= 'Karnataka') 
emrg_country = models.CharField('Country', max_length=20, default = 'India') 
emrg_mobile1 = models.IntegerField('Mobile1', max_length=12) 
emrg_mobile2 = models.IntegerField('Mobile2', null=True, blank=True, max_length=12) 
emrg_landline = models.IntegerField('Land Line',null=True, blank=True, max_length=12) 
emrg_PerEmail = models.EmailField('Email Id', blank=True) 

def __unicode__(self): 
    return self.emp 
+0

您想要顯示其他「表單」或其他「字段」進行編輯嗎?表單與字段不同(通常從表單繼承)。使用單一表格,您可以啓用一些字段進行編輯,有些字段只讀。 – Joe

+0

@Joe,感謝您的評論,我想要的是顯示與特定用戶相關的所有字段,即他的地址,緊急聯繫人等:用戶應該能夠在他想更新時編輯這些字段。希望我清楚。我可以實現,但目的應該解決 – just10minutes

回答

0

有你在這裏簡要地介紹:

Django: Changing User Profile by forms

好像到你幾乎相同的問題。

+0

我遇到過類似的解決方案,他們創建包含太多字段的用戶配置文件表單,我不想在一個用戶配置文件表單下有很多字段。 – just10minutes

+0

那麼你對每個用戶運行多個表單所說的話是正確的?這部分不是很清楚。 – Joe

+0

當我說一個單一的用戶profileForm,即擴展userModel在我的情況員工模型。將當前地址,永久地址等所有模型都關聯到Employee Model的pk。 (我希望我已經正確創建了我的模型,我的意思是這種關係是有效的) – just10minutes

相關問題