我對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
您想要顯示其他「表單」或其他「字段」進行編輯嗎?表單與字段不同(通常從表單繼承)。使用單一表格,您可以啓用一些字段進行編輯,有些字段只讀。 – Joe
@Joe,感謝您的評論,我想要的是顯示與特定用戶相關的所有字段,即他的地址,緊急聯繫人等:用戶應該能夠在他想更新時編輯這些字段。希望我清楚。我可以實現,但目的應該解決 – just10minutes