我在为我们的应用程序设置用户配置文件时遇到了问题。想象一个类似linkedIn 的用户档案,其中包含基本信息、工作和教育职位。
模型(简化)
class UserProfile(models.Model):
about_me = models.TextField(blank=True, null=True)
formatted_name = models.CharField(max_length=120, null=True, blank=True)
username_slug = models.SlugField(null=True, blank=True, unique=True)
location_name = models.CharField(max_length=120, null=True, blank=True)
...
class JobPosition(models.Model):
user_profile = models.ForeignKey(UserProfile)
company_name = models.CharField(max_length=150, null=True, blank=True)
title = models.CharField(max_length=150, null=True, blank=True)
job_description = models.CharField(max_length=1000, null=True, blank=True)
start_date = models.DateField(blank=True, null=True)
end_date = models.DateField(blank=True, null=True)
class Education(models.Model):
user_profile= models.ForeignKey(UserProfile)
degree = models.CharField(max_length=60, null=True, blank=True)
field_of_study = models.CharField(max_length=120, null=True, blank=True)
school_name = models.CharField(max_length=150, null=True, blank=True)
start_date = models.DateField(blank=True, null=True)
end_date = models.DateField(blank=True, null=True)
好的,很明显,用户可以拥有 0-n 个工作职位和 0-n 个教育职位。
表格.py
class BasicForm(ModelForm):
class Meta:
model = UserProfile
fields = ['id', 'about_me', 'linkedin_headline', 'location_name']
# enter code here
class EducationForm(ModelForm):
class Meta:
model = Education
fields = ['id', 'degree', 'field_of_study', 'school_name',
'start_date','end_date']
class WorkForm(ModelForm):
class Meta:
model = JobPosition
fields = ['id','company_name', 'title', 'job_description',
'start_date','end_date']
views.py - 我想把所有东西都放在一个函数中,因为我不想调用其他 URL。(见模板后面)。用户应该能够在网站上编辑他的职位,点击“更新”并被重定向回个人资料网站。- 我尝试通过更新按钮的名称应用区分帖子收入的方法,如下所示:如何构建多个提交按钮 django 表单? - 它目前没有做很多验证工作
def detail(request, slug):
u = get_object_or_404(UserProfile, username_slug=slug)
#checking the request on Post
if request.method == 'POST':
# Battery of IF statements to determine which form has been used
# if it's updating basic info
if 'updateBasic' in request.POST:
form = BasicForm(request.POST)
if form.is_valid():
form.save()
# if its a Work Position
if 'updateWork' in request.POST:
form = WorkForm(request.POST)
if form.is_valid():
form.save()
# ... same for education...
# if there is no POST request, then the profile is just called to be displayed
else:
basicForm = BasicForm()
educForm = EducationForm()
workForm = WorkForm()
#CSRF Token generation
c = {'user': u,
'years' : range( datetime.now().year, 1980, -1),
'months' : range( 1,13),
'basicForm': basicForm,
'educForm': educForm,
'workForm': workForm}
#CSRF Token generation
c.update(csrf(request))
return render(request, 'userprofile/detail.html', c)
模板: 非常简单。循环工作和教育职位:
{% for work in user.positions %}
<div id="work{{ forloop.counter }}" class="row">
<div class="large-2 small-3 columns">
<h6> {{ work.end_date|date:'M Y'|default:"NOW" }}<br>{{ work.start_date|date:'M Y' }}</h6>
</div>
<div class="large-10 small-9 columns">
<h6>{{ work.title }}
<a class="show_hide editIcon" href="#" rel="#editWork{{ forloop.counter }} #work{{ forloop.counter }}" title="Edit"><i class="icon-edit pull-right editIcon icon-large"></i></a>
</h6>
<h6 class="dblue ">{{ work.company_name }}</h6>
{% if work.job_description %}
<p> {{ work.job_description}} </p>
{% endif %}
{% if not forloop.last %}
<hr>
{% endif %}
</div>
</div>
<div id="editWork{{ forloop.counter }}" style="display: none;" class="row editForm">
<div class="large-10 large-centered columns">
<h5>Edit</h5>
<form class="custom" action="#" method="post" name="WorkForm"> {% csrf_token %}
<div class="row">
<div class="large-6 columns">
<label for="company">Company:</label>
<input type="text" name="company" id="company" placeholder="Example Ltd" required value="{{ work.company_name }}"/>
</div>
<div class="large-6 columns">
<label for="title">Title:</label>
<input type="text" name="title" id="title" placeholder="Example position" required value="{{ work.title }}"/>
</div>
</div>
...
<div class="row">
<div class="large-12 columns">
<label for="desc">Description</label>
<textarea name="desc" id="desc" cols="40" rows="6" value="{{ edu.field_of_study_description }}"></textarea>
</div>
</div>
<div class="row">
<div class="large-2 small-3 columns">
<button class="tiny submit" type="submit" name="updateWork" title="Update this position" >update</button>
</div>
<div class="large-2 small-3 columns">
<button class="tiny submit" type="reset" title"Clear the form">Reset</button>
</div>
<div class="large-2 small-3 columns">
<a class="show_hide button tiny" href="#" rel="#editWork{{ forloop.counter }} #work{{ forloop.counter }}" title="Close the edit panel">Cancel</a>
</div>
<div class="large-3 columns">
<a class="button tiny secondary" href="#" title="Delete this position"> Delete</a>
</div>
</div>
</form>
</div>
</div>
{% endfor %}
所以我做什么:
- 我遍历所有工作位置并生成一个 div 来编辑这个确切的位置。
- 单击“编辑按钮”时会显示 div,并且 javascript 会启动以使 div 可见(在非编辑 div 上滑动)
- 然后用户应该能够编辑这个确切的位置。单击更新,我调用详细操作来处理更新请求。(尚未实现)
- 我为教育做同样的事情
- 我知道表格还没有集成。因为我真的不知道如何以正确的方式做到这一点......
问题
- 如何正确显示每个职位的模型之一?(Formests 并不是我认为我应该使用的,因为它们只允许一组表单而不是单个实例)
- 如何用相应的值填充它?(这甚至可以在运行时完成,还是我必须制作一个填充了视图中已有值的表单数组,然后将该数组传递给模板?)
- 我一般在正确的道路上吗?:)
很抱歉这篇冗长的帖子,但我认为我宁愿给你尽可能多的信息,这样你就可以希望以正确的方式指导我。
现在已经提前非常感谢
菲尔