【问题标题】:objects.all() query not workingobjects.all() 查询不起作用
【发布时间】:2015-08-18 07:07:46
【问题描述】:

我正在尝试通过 django 创建用户创建表单。用户(以下称为开发人员)可以从主管列表中选择自己进行注册。问题是,我没有从查询中获取所有主管的列表。当我使用 objects.get() 时,我收到收到 2 个对象的错误。这意味着查询正在从数据库中获取行。

models.py

from django.db import models

class UserProfile(models.Model):
    name = models.CharField(max_length=50,verbose_name="Name")
    login = models.CharField(max_length=(25),verbose_name="Login")
    password = models.CharField(max_length=100, verbose_name="Password")
    phone = models.CharField(max_length=20, verbose_name="Phone number", null=True, default=None, blank=True)
    born_date = models.DateField(verbose_name="Born date" , null=True,default=None, blank=True)
    last_connection = models.DateTimeField(verbose_name="Date of last connection" , null=True, default=None, blank=True)
    email = models.EmailField(verbose_name="Email")
    years_seniority = models.IntegerField(verbose_name="Seniority", default=0)
    date_created = models.DateField(verbose_name="Date of Birthday", auto_now_add=True)

    def __str__(self):
        return self.name


class Supervisor(UserProfile):
    specialisation = models.CharField(max_length=50, verbose_name="Specialisation")

class Developer(UserProfile):
    supervisor = models.ForeignKey(Supervisor, verbose_name="Supervisor")

表单视图create_developer.py -

from django.shortcuts import render
from django.http import HttpResponse
from TasksManager.models import Supervisor, Developer
# View for create_developer
def page(request):
    error = False
    # If form has posted
    if request.POST:
        if 'name' in request.POST:
            name = request.POST.get('name', '')
        else:
            error=True
        if 'login' in request.POST:
            login = request.POST.get('login', '')
        else:
            error=True
        if 'password' in request.POST:
            password = request.POST.get('password', '')
        else:
            error=True
        if 'supervisor' in request.POST:
            supervisor_id = request.POST.get('supervisor', '')
        else:
            error=True
        if not error:
            supervisor = Supervisor.objects.get(id = supervisor_id)
            new_dev = Developer(name=name, login=login, password=password,supervisor=supervisor)
            new_dev.save()
            return HttpResponse("Developer added")
        else:
            return HttpResponse("An error as occured")
    else:
        supervisors_list =  Supervisor.objects.all()
        return render(request, 'en/public/create_developer.html')

模板create_developer.html

{% extends "base.html" %}
    {% block title_html %}
        Create Developer
    {% endblock %}
    {% block h1 %}
        Create Developer
    {% endblock %}
    {% block article_content %}
        <form method="post" action="{% url 'create_developer' %}" >


        <table>
            <tr>
                <td>Name</td>
                <td>
                    <input type="text" name="name" />
                </td>
            </tr>

            <tr>
                <td>Login</td>
                <td>
                    <input type="text" name="login" />
                </td>
            </tr>

            <tr>
                <td>Password</td>
                <td>
                <input type="text" name="password" />
                </td>
            </tr>

            <tr>
            <td>Supervisor</td>
            <td>
                <select name="supervisor">  
                    {% for supervisor in supervisors_list %}
                        <option value="{{ supervisor.id }}">{{ supervisor.name}}</option>
                    {% endfor %}
                </select>
            </td>
            </tr>

            <tr>
                <td></td>
                <td>
                    <input type="submit" value="Valid" />
                </td>
            </tr>

        </table>
    </form>
{% endblock %}

主管 选择列表应显示该列表。但我在那里得到一个空列表。 {{ supervisors_list|length }} 的输出为零。

如何调试这个?

【问题讨论】:

  • 看起来您没有将 supervisors_list 作为上下文传递给渲染函数。
  • 与自己处理密码和用户身份验证信息相反,看看 django 内置的用户模型。如果它不能完全满足您的需求,可以很容易地对其进行自定义(参见最后的示例)docs.djangoproject.com/en/1.8/topics/auth/customizing
  • 谢谢,我会用那个:)
  • 完全不相关,但无论如何,学习使用 django 的表单...

标签: python django django-templates django-views


【解决方案1】:

您必须将上下文传递给 html:

from django.shortcuts import render
from django.http import HttpResponse
from TasksManager.models import Supervisor, Developer
# View for create_developer
def page(request):
    error = False
    # If form has posted
    if request.POST:
        if 'name' in request.POST:
            name = request.POST.get('name', '')
        else:
            error=True
        if 'login' in request.POST:
            login = request.POST.get('login', '')
        else:
            error=True
        if 'password' in request.POST:
            password = request.POST.get('password', '')
        else:
            error=True
        if 'supervisor' in request.POST:
            supervisor_id = request.POST.get('supervisor', '')
        else:
            error=True
        if not error:
            supervisor = Supervisor.objects.get(id = supervisor_id)
            new_dev = Developer(name=name, login=login, password=password,supervisor=supervisor)
            new_dev.save()
            return HttpResponse("Developer added")
        else:
            return HttpResponse("An error as occured")
    else:
        supervisors_list =  Supervisor.objects.all()
        return render(request, 'en/public/create_developer.html', {'supervisors_list' : supervisors_list})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2015-04-18
    • 2013-09-04
    • 2011-11-29
    • 1970-01-01
    • 2015-01-13
    • 2014-01-19
    相关资源
    最近更新 更多