Django创建与用户帐户

时间:2015-04-25 03:28:53

标签: python django

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

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

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

用户的工作流程为:

  1. 登录并重定向到会员视图。
  2. 如果存在组织配置文件,请显示它。如果组织配置文件不存在,请重定向到编辑视图。
  3. 在编辑视图中,如果请求包含POST数据,请将其添加到组织配置文件并保存。如果它不包含POST数据,请创建一个允许用户输入数据的实例。
  4. 在数据库中创建一个空白记录,表单生成正确,但表单的结果未保存到数据库中。

    我认为绊倒我的是正确创建记录并通过外键关系存储结果,但我已经尝试了我能想到的一切。

    非常感谢所有帮助。

    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;奇怪。

1 个答案:

答案 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做的事情,因为期望我在创建之后永远不需要更改该用户字段。