【问题标题】:Django request.method = 'GET' not workingDjango request.method = 'GET' 不工作
【发布时间】:2015-03-25 05:23:19
【问题描述】:

我正在尝试在我的应用程序上加载 db 表数据,以便对其进行更新,到目前为止,我发现这是由 request.method = 'GET' 完成的,不知道是否总是这样,但是当然这是实现这一目标的方法之一。

但是,我的应用程序充满了POST 请求,要在 db 表上创建新文档,我只需要通过指定其名称来检索其中一个。使用'GET' 方法。但它不起作用,似乎它没有评估表达式,我真的不知道为什么。

这是我的models.py

class Proyecto(models.Model):
    id_proyecto = models.IntegerField(primary_key=True) #integer NOT NULL, CLAVE PRIMARIA
    nombre_proyecto = models.TextField(null=True) #text,
    fecha_creacion = models.DateField(null=True) #date,
    existente = models.BooleanField()

    def __unicode__(self):
        return u'%s | %s ' % (self.id_proyecto, self.nombre_proyecto)

    class Meta:
        unique_together = [("id_proyecto","nombre_proyecto")]
        db_table = 'proyecto'

我将使用existente BooleanField 作为模板上的复选标记,如果此existente 处于活动状态,则通过其nombre_proyecto 字段(项目名称)执行查询并带上指定的文档。

我的forms.py

class ProyectoForm(forms.Form):
    nombre_proyecto = forms.CharField(widget=forms.TextInput())
    existente = forms.BooleanField(required=False)

    def clean(self):
        return self.cleaned_data

我的views.py方法所在:

def proyecto_view(request):
    alerta=""
    if request.method == "POST":
        form = ProyectoForm(request.POST)
        if form.is_valid():
            name =form.cleaned_data['nombre_proyecto'] #hay que verificar si el proyecto ya existe
        if existente is not None and existente != '':
            projects = Proyecto.objects.filter(nombre_proyecto=name)
            ctx = {"projects" : projects}
            return render_to_response('scppp/proyecto.html', ctx, context_instance=RequestContext(request))
        if Proyecto.objects.filter(nombre_proyecto=name).exists():
            alerta="ya existe el proyecto"
            formProy = 1
            ctx ={'alerta':alerta, 'formProy':formProy}
            return render_to_response('scppp/inicial.html', ctx, context_instance=RequestContext(request))
        else:
            if not name:    
                id_proyecto=1
            else:
                id_proyecto=Proyecto.objects.all().aggregate(Max('id_proyecto'))['id_proyecto__max']+1
                nombre_proyecto = name
    else:
        alerta = "data erronea"
        formProy = 1
        ctx = {'alerta':alerta, 'formProy':formProy}
        return render_to_response('scppp/inicial.html', ctx, context_instance=RequestContext(request))

    sombra = "style=\"color: #a2a2a2;\""
    num = ""
    slash = ""
    quotes = ""
    arenas = ""
    fluidos = ""
    onclick = ""
    sombra2 = sombra
    graf = ""
    formProy = 0
    ctx = {'id_proyecto':id_proyecto,'nombre_proyecto':nombre_proyecto, 'sombra':sombra, 'sombra2':sombra2, 'graf':graf, 'num':num, 'slash':slash, 'quotes':quotes, 'arenas':arenas, 'fluidos':fluidos, 'onclick':onclick, 'alerta':alerta, 'formProy':formProy}
    return render_to_response('scppp/proyecto.html', ctx, context_instance=RequestContext(request))
else:
    form = ProyectoForm()
    formProy = 1
    ctx = {'form': form, 'formProy': formProy}
    return render_to_response('scppp/inicial.html', ctx, context_instance=RequestContext(request))

这里if existente is not None and existente != '': 条件应该评估是否existente inicial.html 上的复选标记处于活动状态,如果是,则呈现 proyecto.html 模板。

inicial.html 带有复选标记的有趣代码:

<tr><td>
    <span class="Sub-Titulo-Aplicacion">Tipo de Proyecto: </span>
    <input class="check-style" type="checkbox" name="curva" value="checkbox" >Petroleo</input>
    </td></tr>
    <tr><td>
    <input class="check-style" type="checkbox" name="curva" value="checkbox" >Gas</input>
    </td></tr>
    <tr><td>
    <span class="Sub-Titulo-Aplicacion">Proyecto: </span>
    <input class="check-style" type="checkbox" name="tipo" value="checkbox" >Nuevo</input>
    </td></tr>
    <tr><td>
    <input class="check-style" type="checkbox" name="existente" value="existente" >Existente</input>
 </td></tr>

如果此复选框处于活动状态,则呈现 proyecto.html:

{% for project in projects %}
            <a  class="Contenedor-Texto-Menu"><span class="Text-menu" > Datos</span></a>
             <a href="/pozos{{num}}/{{id_proyecto}}/{{nombre_proyecto}}" class="Contenedor-Texto-sub-Menu"><span class="Text-menu" > Yacimiento y Pozo</span></a>
             <a {% autoescape off %}{{arenas}}{{slash}}{{id_proyecto}}{{slash}}{{nombre_proyecto}}{{quotes}}{% endautoescape %} class="Contenedor-Texto-sub-Menu"><span class="Text-menu" {% autoescape off %}{{sombra}}{% endautoescape %}> Arena </span></a><tr>
             <a {% autoescape off %}{{fluidos}}{{slash}}{{id_proyecto}}{{slash}}{{nombre_proyecto}}{{quotes}}{% endautoescape %} class="Contenedor-Texto-sub-Menu"><span class="Text-menu" {% autoescape off %}{{sombra}}{% endautoescape %}> Fluido </span></a><tr>
             <div style="overflow:hidden; width:0px; height:0px;">
            <form id="submitArch" action="/archivo/{{id_proyecto}}/{{nombre_proyecto}}/" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input id="cargarArch" type="file" class="Contenedor-Texto-sub-Menu" name="archivo" style="display:none;" onchange="submitArch()">
            </form>
            </div>
            <a class="Contenedor-Texto-sub-Menu" {% autoescape off %}{{onclick}}{% endautoescape %}><span class="Text-menu" {% autoescape off %}{{sombra}}{% endautoescape %}> Cargar un archivo </span></a><tr>
             <!--<a href="/graficos/{{id_proyecto}}/{{nombre_proyecto}}" class="Contenedor-Texto-Menu">-->
            <a {% autoescape off %}{{graf}}{% endautoescape %} class="Contenedor-Texto-Menu" {% autoescape off %}{{sombra2}}{% endautoescape %}><span class="Text-menu" > Procesamiento </span></a><tr>
            <a  class="Contenedor-Texto-Menu" {% autoescape off %}{{sombra2}}{% endautoescape %}><span class="Text-menu" > Reporte </span></a><tr>
{% endfor %}

这就是existente BooleanField 的所有逻辑,如果这听起来很无聊,很抱歉,但这是一个已经开始的项目,有时会让人感到困惑。

如果你知道为什么这不是评估条件请告诉我,我就是想不通。

非常感谢!

PS = 我正在使用 Django==1.6.1 、Python 3.3.1 和 PostgreSQL v9.0。

【问题讨论】:

  • 在视图中你的UPDATEGET 中在哪里?
  • 它应该只是将数据加载到内存中,然后在 html 字段上显示,然后我将在 html 视图上编辑字段,还是我遗漏了什么?
  • "它不计算表达式" 。哪种表达方式?
  • 还更正了问题中的缩进,两个else 条件和else for def ?
  • 对不起,我的意思是'GET'条件,就像它不存在一样,我使用'count'方法检查项目名称是否已经存在,然后意识到count不允许我这样做GET 请求,所以我将其更改为存在(),但仍然没有

标签: python html django postgresql psycopg2


【解决方案1】:

不需要使用filter.exists。只需要

if Proyecto.objects.filter(nombre_proyecto=name):

如果查询不匹配任何文档,它将返回[]。所以id不进入if条件。因为emptylistemptystring在python中引用False

如果您只想确定是否存在至少一个结果。使用exists()效率更高。

if Proyecto.objects.filter(nombre_proyecto=name).exists():

如果你想update。只需使用get

proyecto = Proyecto.objects.get(nombre_proyecto=name)
proyecto.nombre_proyecto = "newname"
proyecto.save()

如果要更新查询集中的multiple 文档。

Proyecto.objects.filter(nombre_proyecto=name).update(nombre_proyecto="newname")

注意 如果Proyecto.objects.filter(nombre_proyecto=name)给出了多个文档,不要使用get。使用update。否则会出现multple objects returned错误。

【讨论】:

  • 哦,好吧,我明白了,我只需要检查是否至少存在一个结果,所以我猜没关系,顺便说一句,更改为“if Proyecto.objects.filter(nombre_proyecto=name) :" 似乎进入了 if 条件,但是 if 抛出一个“existente” NameError,未定义,奇怪...
  • 但是,如果我使用 temp,它应该可以在没有它的情况下完成任务,对吧?
  • 非常感谢,好像是正确的代码,但它没有考虑到复选标记,该死,我应该开一个新问题吗?
  • 是的,我想。我会在那里回答同样的问题。 :) 你应该删除这个
  • 谢谢! :),只是测试了一下,我会在几分钟后打开它,再次非常感谢!
猜你喜欢
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多