在书面的django测试中,如何获取当前登录的用户?
例如,这是我想写的测试:
def test_author_set_once(self):
self.client.login(username='Adam', password='password')
#create an object and test the author is adam
self.client.login(username='Barry', password='password')
#modify the first object and test that the author has not changed
Run Code Online (Sandbox Code Playgroud)
所以我希望能够说出类似......
self.assertEqual(object.author, self.client.user)
Run Code Online (Sandbox Code Playgroud)
(但我不能)
我此刻编码的方式是这样的:
self.client.login(username='Adam', password='password')
self.user = User.objects.get(username='Adam')
#create an object
self.assertEqual(object.author, self.user)
Run Code Online (Sandbox Code Playgroud)
这依赖于request.user与特定用户对象相同的假设.我想这没关系,但看起来有点笨重.
反正有没有避免这个假设?
我想测试一个我写的简单装饰器:
它看起来像这样:
#utilities.py
import other_module
def decor(f):
@wraps(f)
def wrapper(*args, **kwds):
other_module.startdoingsomething()
try:
return f(*args, **kwds)
finally:
other_module.enddoingsomething()
return wrapper
Run Code Online (Sandbox Code Playgroud)
然后我用python-mock测试它:
#test_utilities.py
def test_decor(self):
mock_func = Mock()
decorated_func = self.utilities.decor(mock_func)
decorated_func(1,2,3)
self.assertTrue(self.other_module.startdoingsomething.called)
self.assertTrue(self.other_module.enddoingsomething.called)
mock_func.assert_called_with(1,2,3)
Run Code Online (Sandbox Code Playgroud)
但它踢回来:
Traceback (most recent call last):
File "test_utilities.py", line 25, in test_decor
decorated_func = Mock(wraps=self.utilities.decor(mock_func))
File "utilities.py", line 35, in decor
@wraps(f)
File "/usr/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 660, in __getattr__
raise AttributeError(name)
AttributeError: __name__
Run Code Online (Sandbox Code Playgroud)
我知道functools.wraps()只是一个帮手包装器.所以如果我把它拿出去测试就行了.
我可以让模拟玩functools.wraps()吗?
Python 2.7.3
我要初始化一个放大器状态,如下所示:
<amp-state id="tabs">
<script type="application/json">
{
"selected": "latest"
}
</script>
</amp-state>
Run Code Online (Sandbox Code Playgroud)
然后将这个初始化值显示在首页请求中:
<p [text]="tabs.selected"><p>
Run Code Online (Sandbox Code Playgroud)
这行不通。p标签的内容仅在状态更改时才更新。例如,通过按钮:
<button on="tap:AMP.setState({tabs: {selected: 'top'}})">Press me</button>
Run Code Online (Sandbox Code Playgroud)
我希望页面上的元素能反映出进一步的用户交互之前的初始化状态。
Codepen:https://codepen.io/powlo/pen/VMpVRm/ ? editors = 1000
我正在使用邮递员来验证从api返回的json数据的架构。
我有一个通过基本的HTTP验证运行的测试,然后以:
if (tv4.error){
console.log("Validation failed: ", tv4.error);
}
Run Code Online (Sandbox Code Playgroud)
我回来的错误很难理解。
验证失败:12:22:41.316
对象:{}
消息:“无效的类型:数字(预期的字符串)”
名称:“ ValidationError”
类型:“ Error”
在Django中,我有一个发布折旧警告的包(django.views.generic.simple).如果这个警告描述了从哪里进行导入将是有用的,因此编码器可以进入并更改文件而无需单步执行代码来查找它.
一般情况就是如此
#file1.py
import file2.py
#file2.py
import warnings
warnings.warn(
'Package deprecated: imported from %s' % __importer__,
DeprecationWarning
)
Run Code Online (Sandbox Code Playgroud)
其中__importer__是包含"file1.py"的虚构属性,或某些此类引用.
有没有办法做到这一点?
我注意到我的模板正在渲染我的model.CharField和model.TextField而没有任何多余的空格.
例如,如果我输入数据,如...
This is a test
to see what happens.
Run Code Online (Sandbox Code Playgroud)
渲染的对象字段将显示为......
This is a test to see what happens.
Run Code Online (Sandbox Code Playgroud)
这是Django的故意特征还是我错过了某些过滤器或参数?
我用一些调试代码(print object.field)检查了字段本身,它确实包含额外的空格,所以问题出在渲染方面.
如何允许用户在TextFields中输入数据段落?如何保留用户可能输入的空白?
我正在研究的Django网站在内容更新时发送电子邮件.
我想添加的功能是用户可以回复这些邮件,即对主题发表评论.然后,此回复会在页面上显示更新.
解决这个问题的好方法是什么?有没有可以放入的模块?
我希望管理员能够编辑普通用户无法编辑的字段。例如作者或订阅者等。
我试过这个:Django admin:如何在模型中显示一个标记为 editable=False' 的字段?
(答案中给出的可编辑部分)
但是该字段仍然无法出现在管理页面上。
这里有一些信息供参考:
#models.py
class MyModel(models.Model):
myfield = models.ManyToManyField(User, blank=True, editable=False)
#admin.py
class MyModelAdminForm(forms.ModelForm):
myfield = models.ManyToManyField(User, blank=True, editable=True)
class Meta(object):
model = MyModel
class MyModelAdmin(admin.ModelAdmin):
form = MyModelAdminForm
admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)
如果我将模型更改为状态 editable=True 那么我会在我的管理页面上看到该字段。(如预期)
我正在使用 Django 1.3,Python 2.6
在表单处理期间,我希望能够在模型对象上设置外键字段,而无需用户从下拉列表中选择键.
例如:
#models.py
class AAA(models.Model):
some_field = models.TextField()
class BBB(models.Model):
another_field = models.TextField()
key_field = models.ForeignKey('AAA')
Run Code Online (Sandbox Code Playgroud)
用户将从显示"AAA"实例的视图导航到create_object样式视图,该视图将在给定参考"AAA"的参数的情况下创建"BBB"实例.外键在代码中设置为指向'AAA'实例.
django评论框架似乎这样做,但我无法弄清楚如何.
有任何想法吗?我相信它应该很简单.
在我正在研究的Django项目中,我在视图中导入一个表单,如下所示
#views.py
from forms import SomeForm
Run Code Online (Sandbox Code Playgroud)
然后在我的测试文件中
#form_test.py
from app.forms import SomeForm
.
.
.
self.assertTrue(isinstance(response.context['form'], SomeForm))
Run Code Online (Sandbox Code Playgroud)
为什么这个实例不起作用?
如果我检查两个对象的type()输出,我得到这个:
response.context form:预期形式:
我可以通过使views.py中的导入机制与form_test.py中的导入机制相匹配来解决这个问题,但这似乎是错误的方法.
供参考,文件结构如下:
嗨,这是我的 admin.py 中的一个片段
#admin.py
class UserForm(forms.ModelForm):
class Meta:
model = User
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email=email).exists():
raise forms.ValidationError("This email already used")
return email
class UserAdmin(admin.ModelAdmin):
form = UserForm
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
我用它来检查不能使用已使用的电子邮件地址创建新用户。问题是,当我编辑现有用户时,验证检查失败,因为有一个用户具有该邮件地址,但没关系,因为它是我正在编辑的用户。
如何告诉表单验证忽略与当前用户的匹配?
django ×7
python ×6
django-admin ×2
django-forms ×2
import ×2
amp-html ×1
api ×1
email ×1
foreign-keys ×1
forms ×1
functools ×1
isinstance ×1
json ×1
mocking ×1
node.js ×1
postman ×1
python-2.7 ×1
rendering ×1
testing ×1
textfield ×1
tv4 ×1
types ×1
unit-testing ×1
validation ×1