Django创建与用户帐户匹配的onetoone记录

2024-04-19 20:14:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个django应用程序,它需要用户和信息记录之间的一对一关系。在

该应用程序允许用户维护有关其组织的单个记录。在

我一直在努力理解如何通过表单输入数据。我尝试过许多不同的方法,但这里是最近的一次尝试。在

用户的工作流是:

  1. 登录并重定向到成员视图。在
  2. 如果组织配置文件存在,则显示它。如果组织配置文件不存在,请重定向到“编辑”视图。在
  3. 在edit视图中,如果请求包含POST数据,则将其添加到组织配置文件并保存。如果它不包含POST数据,请创建一个实例以允许用户输入数据。在

数据库中会创建一个空白记录,并且表单会正确生成,但是表单的结果不会保存到数据库中。在

我想让我困惑的是正确地创建记录并通过外键关系存储结果,但是我已经尝试了我能想到的一切。在

非常感谢所有的帮助。在

模型.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')
    ...

视图.py:

^{pr2}$

更新1:添加html表单和表单.py

html:

^{3}$

表单.py

from django import forms
from models import Program


class ProgramForm(forms.ModelForm):

    class Meta:
        model = Program
        fields = '__all__'

更新2:在中添加打印命令视图.py评估表格结果

在中添加了“打印表单”视图.py在“如果”之前表格有效吗():”并且可以在终端中看到结果:

<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>

添加“打印”后获取表格错误“:

<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})

但在生成表单时,并没有实际选择字段的“user”值。奇怪的。在


Tags: 数据django用户py视图表单models配置文件
1条回答
网友
1楼 · 发布于 2024-04-19 20:14:18

你没有发布整个表单,但是我看到的是,用户没有在表单上显式地选择他们的用户名。因此,您需要确保在保存之前从视图中手动填充该列。在

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')

当然,你可以做的另一件事是模型.py,将字段的可编辑属性设置为False。这就是我为用户OnetoOnes所做的,因为我的期望是,在创建之后,我永远不需要更改用户字段。在

相关问题 更多 >