如何区分None和False使用django模板?
{% if x %}
True
{% else %}
None and False - how can I split this case?
{% endif %}
Run Code Online (Sandbox Code Playgroud) 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) 我有以下型号:
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.
我在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等方式将其中任何一个(或所有这些)关闭都无济于事.
我对此代码的目标是,当您输入一定数量时,您将根据键入的内容打印数字和其他输出.出于某种原因,我在这里给出了错误"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) 我有一个相当复杂的模型,第一次调用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调用的所有参数正是我想要的.
我并不热衷于剥离模型以找到问题,因为模型非常复杂.(我的所有其他模型,其中许多类似,似乎工作正常.)
那么什么可能导致这个奇怪的消息?
我有一个模型,我覆盖了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?你们都在想什么?
我有一个Django应用程序在gunicorn服务器上运行,前面有一个 nginx.我需要使用HTTP 500结果诊断生产失败,但错误日志文件不包含我期望的信息.正是如此:
errorlog = "/somepath/gunicorn-errors.log"error_log /somepath/nginx-errors.log;InternalErrorView在dispatch其中确实无条件raise Exception("Just for testing.")
这一观点被映射到URL/fail_nowhandler500DEBUG=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?
在我的代码中某处说
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 的 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)
现在想知道我在调用密码重置时是否遗漏了什么,或者手头是否存在邮件服务器配置问题?