我正在创建一个django应用程序,它需要用户和信息记录之间的一对一关系。
该应用程序旨在允许用户维护有关其组织的单一记录。
我一直在努力了解如何通过表单输入数据。我尝试了很多不同的方法,但这是最近的尝试。
用户的工作流程为:
在数据库中创建一个空白记录,表单生成正确,但表单的结果未保存到数据库中。
我认为绊倒我的是正确创建记录并通过外键关系存储结果,但我已经尝试了我能想到的一切。
非常感谢所有帮助。
models.py
from django.contrib.auth.models import User
class Program(models.Model):
user = models.OneToOneField(User)
unit_name = models.CharField(max_length=50, verbose_name='Name')
...
views.py:
def member(request):
if request.user.is_authenticated():
current_user = request.user
record_data, record_exists = Program.objects.get_or_create(user=current_user)
if record_exists:
return render(request, 'programs_dbase/member.html', {'record_data': record_data})
else:
return render(request, 'programs_dbase/member.html', {'record_exists': record_exists})
elif request.user.is_authenticated() is False:
return HttpResponseRedirect('/login/')
def edit(request):
if request.user.is_authenticated() and request.method == 'POST':
current_user = request.user
record_data = Program.objects.get(user=current_user)
form = ProgramForm(request.POST, instance=record_data)
if form.is_valid():
form.save()
return HttpResponseRedirect('/member/')
elif request.user.is_authenticated() and request.method != 'POST':
current_user = request.user
record_data = Program.objects.get(user=current_user)
program_info = ProgramForm(request.POST, instance=record_data)
return render(request, 'programs_dbase/edit.html', {'program_info': program_info})
else:
return redirect('login')
更新1:添加html表单和forms.py
HTML:
<div class="form-group">
<form action="/edit/" method="post">
{% csrf_token %}
<h4>Name</h4>
<label for="unit_name">Name</label> {{ program_info.unit_name }}<br />
<!-- snip -->
<button type="submit" class="btn btn-success">Submit</button>
</form>
</div>
forms.py
from django import forms
from models import Program
class ProgramForm(forms.ModelForm):
class Meta:
model = Program
fields = '__all__'
更新2:在views.py中添加print命令以评估表单结果
添加&#34;打印表格&#34;在#34之前的views.py中;如果是form.is_valid():&#34;并且可以在终端中看到结果:
<tr>
<th>
<label for="id_user">User:</label>
</th>
<td>
<ul class="errorlist">
<li>This field is required.</li>
</ul>
<select id="id_user" name="user">
<option value="" selected="selected">---------</option>
<option value="1">twitch</option>
</select>
</td>
</tr>
在添加&#34; print form.errors&#34;:
之后获取此信息<ul class="errorlist"><li>user<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
更新3:为初始表单指定用户:
试图改变这个:
program_info = ProgramForm(request.POST, instance=record_data, initial={'user': current_user})
但是&#39;用户&#39;生成表单时,实际上未选择该字段的值。 WTF;奇怪。
答案 0 :(得分:1)
您没有发布整个表单,但是在我看到的情况下,用户没有在表单上明确选择他们的用户名。因此,您需要确保在保存之前从视图中手动填充列。
def edit(request):
if request.user.is_authenticated() and request.method == 'POST':
current_user = request.user
record_data = Program.objects.get(user=current_user)
form = ProgramForm(request.POST, instance=record_data)
if form.is_valid():
instance = form.save(commit=False)
instance.user = current_user
instance.save()
return HttpResponseRedirect('/member/')
elif request.user.is_authenticated() and request.method != 'POST':
current_user = request.user
record_data = Program.objects.get(user=current_user)
program_info = ProgramForm(request.POST, instance=record_data)
return render(request, 'programs_dbase/edit.html', {'program_info': program_info})
else:
return redirect('login')
当然,您可以做的另一件事是从models.py中,将字段的可编辑属性设置为False。这就是我为User OnetoOnes做的事情,因为期望我在创建之后永远不需要更改该用户字段。