小编Lut*_*elt的帖子

Django模板:False与None

如何区分NoneFalse使用django模板?

{% if x %}
True 
{% else %}
None and False - how can I split this case?
{% endif %}
Run Code Online (Sandbox Code Playgroud)

python django templates if-statement

15
推荐指数
2
解决办法
4250
查看次数

pytest capsys:检查输出并报告?

Python 3.4.1,pytest 2.6.2.

当测试失败时,pytest将定期报告测试中打印到stdout的内容.例如这段代码:

def method_under_test():
    print("Hallo, Welt!")
    return 41

def test_result_only():
    result = method_under_test()
    assert result == 42
Run Code Online (Sandbox Code Playgroud)

执行时python -m pytest myfile.py,将报告此:

================================== FAILURES ===================================
______________________________ test_result_only _______________________________

    def test_result_only():
        result = method_under_test()
>       assert result == 42
E       assert 41 == 42

pytestest.py:9: AssertionError
---------------------------- Captured stdout call -----------------------------
Hallo, Welt!
========================== 1 failed in 0.03 seconds ===========================
Run Code Online (Sandbox Code Playgroud)

这是一个非常好的功能.但是当我使用pytest的内置capsys夹具时,如下所示:

def test_result_and_stdout(capsys):
    result = method_under_test()
    out, err = capsys.readouterr()
    assert out.startswith("Hello")
    assert result …
Run Code Online (Sandbox Code Playgroud)

python pytest

12
推荐指数
2
解决办法
6800
查看次数

在django使用F()和timedelta进行查询

我有以下型号:

class Process(models.Model):
  title = models.Charfield(max_length=255)
  date_up = models.DateTimeField(auto_now_add=True)
  days_activation = models.PositiveSmallIntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

现在我需要Process根据它们的值来查询已过期的所有对象days_activation.

我试过了

from datetime import datetime, timedelta

Process.objects.filter(date_up__lte=datetime.now()-timedelta(days=F('days_activation')))
Run Code Online (Sandbox Code Playgroud)

并收到以下错误消息:

TypeError:timedelta days组件的不支持类型:F

我当然可以用Python做到这一点:

filter (lambda x: x.date_up<=datetime.now() - timedelta(days=x.days_activation), 
        Process.objects.all ()), 
Run Code Online (Sandbox Code Playgroud)

但我真的需要制作一个django.db.models.query.QuerySet.

django orm

9
推荐指数
2
解决办法
2739
查看次数

使用django.test.SimpleTestCase进行pytest.mark.parametrize

我在Windows上使用Python 3.6.2上的pytest 3.2.2和Django 1.11.5.

以下代码

import django.test
import pytest

class ParametrizeTest:
    @pytest.mark.parametrize("param", ["a", "b"])
    def test_pytest(self, param):
        print(param)
        assert False
Run Code Online (Sandbox Code Playgroud)

按预期工作:

scratch_test.py::ParametrizeTest::test_pytest[a] FAILED scratch_test.py::ParametrizeTest::test_pytest[b]失败

但是一旦我改变它以使用Django SimpleTestCase,就像这样:

class ParametrizeTest(django.test.SimpleTestCase):
   ...
Run Code Online (Sandbox Code Playgroud)

它失败了

TypeError:test_pytest()缺少1个必需的位置参数:'param'

谁能解释为什么?怎么办呢?
(实际上我甚至需要使用django.test.TestCase和访问数据库.)

我安装了以下pytest插件:

插件:random-0.2,mock-1.6.2,django-3.1.2,cov-2.5.1

但通过-p no:random等方式将其中任何一个(或所有这些)关闭都无济于事.

django pytest

9
推荐指数
2
解决办法
1173
查看次数

打印时Python"ValueError:不完整格式"("stuff%"%"thingy")

我对此代码的目标是,当您输入一定数量时,您将根据键入的内容打印数字和其他输出.出于某种原因,我在这里给出了错误"ValueError:incomplete format".它与%有关.错误意味着什么,我该如何解决?谢谢!

variable = "Blah"
variable2 = "Blahblah"

text = raw_input("Type some stuff: ")

if "1" in text:
    print ("One %" % variable)
elif "2" in text:
    print ("Two %" % variable2)
Run Code Online (Sandbox Code Playgroud)

python string format

8
推荐指数
2
解决办法
2万
查看次数

AttributeError:'NoneType'对象没有属性'attname'(Django)

我有一个相当复杂的模型,第一次调用MyModel.objects.create(**kwargs)失败了

AttributeError:'NoneType'对象没有属性'attname'

堆栈跟踪像这样下潜(在Django 1.11中)

django/db/models/manager.py:85: in manager_method
   return getattr(self.get_queryset(), name)(*args, **kwargs)
django/db/models/query.py:394: in create
   obj.save(force_insert=True, using=self.db)
django/db/models/base.py:807: in save
   force_update=force_update, update_fields=update_fields)
django/db/models/base.py:837: in save_base
   updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
django/db/models/base.py:889: in _save_table
   pk_val = self._get_pk_val(meta)
django/db/models/base.py:644: in _get_pk_val
   return getattr(self, meta.pk.attname)
django/db/models/query_utils.py:114: in __get__
   val = self._check_parent_chain(instance, self.field_name)
django/db/models/query_utils.py:131: in __check_parent_chain
   return getattr(instance, link_field.attname)
Run Code Online (Sandbox Code Playgroud)

模型定义对我来说没问题.我检查了create调用的所有参数正是我想要的.

我并不热衷于剥离模型以找到问题,因为模型非常复杂.(我的所有其他模型,其中许多类似,似乎工作正常.)

那么什么可能导致这个奇怪的消息?

django django-models

8
推荐指数
2
解决办法
2983
查看次数

覆盖Django get_or_create

我有一个模型,我覆盖了save方法,以便该save方法可以传递到一些数据并自动填写一个字段保存之前.这是我的模型:

class AccountModel(models.Model):

    account = models.ForeignKey(Account)

    def save(self, request=None, *args, **kwargs):
        if request:
            self.account = request.session['account']
        super(AccountModel, self).save(*args, **kwargs)

    class Meta:
        abstract = True
Run Code Online (Sandbox Code Playgroud)

我的想法是为需要与帐户关联的对象设置基本模型,然后我不必在每次出现时处理帐户连接(这很多).

但是:我也想使用get_or_create,它保存新对象而不传递请求.我知道不可以使用get_or_create和做一个try/ except而不是,但我想知道是否有一种方法可以覆盖,get_or_create以及正确的方法是什么.

我查看了代码Manager(我正在考虑重写),该get_or_create函数只调用一个QuerySet.get_or_create函数.也许我可以写它来使用其他管理器功能而不是QuerySet版本的get_or_create?你们都在想什么?

python django subclass django-models django-managers

6
推荐指数
1
解决办法
3682
查看次数

带有gunicorn和nginx的Django:HTTP 500没有出现在日志文件中

我有一个Django应用程序在gunicorn服务器上运行,前面有一个 nginx.我需要使用HTTP 500结果诊断生产失败,但错误日志文件不包含我期望的信息.正是如此:

  • gunicorn有环境 errorlog = "/somepath/gunicorn-errors.log"
  • nginx有设置 error_log /somepath/nginx-errors.log;
  • 我的应用程序有一个InternalErrorViewdispatch其中确实无条件raise Exception("Just for testing.") 这一观点被映射到URL/fail_now
  • 我没有修改过 handler500
  • 当我用DEBUG=True我的浏览器请求 运行我的应用程序时/fail_now,我看到通常的Django错误屏幕,包括"Just for testing."消息.精细.
  • 当我运行我的应用程序时DEBUG=False,我得到的响应只包含<h1>Server Error (500)</h1>,正如预期的那样.精细.
  • 但是,当我查看时gunicorn-errors.log,根本没有HTTP 500事件的条目.为什么?我怎么才能得到它? 我想得到一个追溯.
  • 同样在nginx-errors.log:没有500或/fail_nowURL的痕迹. 为什么?

奖金问题: 当我将其与我原来的生产问题进行比较时,我得到了一个不同的响应:一个9行文档 <h1><p>Internal Server Error</p></h1>作为中心消息. 为什么?

奖金问题2: 当我将我的数据库内容复制到我的登台服务器(配置与生产服务器相同)并DEBUG=True在那里设置 Django时,/fail_now按预期工作,但我原来的问题仍然显示为<h1><p>Internal Server Error</p></h1>. WTF?

django nginx gunicorn

6
推荐指数
1
解决办法
4123
查看次数

AttributeError:'RelatedManager'对象没有属性'remove'

在我的代码中某处说

publisher.publisherperson_set.remove(email__in=pp_remove_set)
Run Code Online (Sandbox Code Playgroud)

执行此操作后,我得到了

AttributeError:'RelatedManager'对象没有属性'remove'

确实:我查看了一下dir(publisher.publisherperson_set),它进行了很多操作(包括add),但没有remove

在什么情况下有可能?

django django-models

6
推荐指数
2
解决办法
3376
查看次数

为什么 Django 的 send_mail 在测试期间不起作用?

我有一个应用程序可以导入多个用户电子邮件地址并为它们创建帐户。为了让他们设置自己的密码,我尝试使用 django 的 PasswordResetForm(在 django.contrib.auth.forms 中)。创建用户帐户后立即调用密码重置:

def reset_password(person):
    form = PasswordResetForm({'email': person.email})
    if form.is_valid():
        form.save(from_email='myname@myserver.com')
Run Code Online (Sandbox Code Playgroud)

除了包含执行此操作的单元测试之外,我还没有进一步进行测试:

import password_reset_module
class TestPasswordReset(TestCase):
     def setUp(self):
         p = Person(email='test@test.com')
     def test_send(self):
         password_reset_module.reset_password(p)
Run Code Online (Sandbox Code Playgroud)

没有断言,现在我只想通过监视我运行的控制台来查看是否有邮件发送:

python -m smtpd -n -c DebuggingServer localhost:1025
Run Code Online (Sandbox Code Playgroud)

保存表单调用 django 的 send_mail。运行测试用例时,send_mail 方法返回 1。但是,控制台中没有显示任何邮件。奇怪的是从django的交互式shell调用send_mail:

python manage.py shell
Run Code Online (Sandbox Code Playgroud)

工作正常。邮件显示在控制台中。在浏览器中单击忘记密码链接也会导致发送邮件。

我也试过基于文件的电子邮件后端无济于事。当前 settings.py 电子邮件设置:

EMAIL_USE_TLS = False
EMAIL_HOST = 'localhost'
DEFAULT_FROM_EMAIL = 'myname@myserver.com'
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_PORT = 1025
Run Code Online (Sandbox Code Playgroud)

现在想知道我在调用密码重置时是否遗漏了什么,或者手头是否存在邮件服务器配置问题?

python email django

5
推荐指数
2
解决办法
2460
查看次数