python - 使用 Django 客户端测试多个复选框
问题描述
我最近读了一本关于 Python 中的 TDD 的书,并认为我可以开始遵循这种模式。
但是第一个问题已经出现了,我似乎无法解决它。
当我发布并打印它时,我得到以下输出:
<QueryDict: {'csrfmiddlewaretoken': ['...'], 'personal_interests': ['3', '1']}>
为了测试这个视图,到目前为止我已经尝试过测试(使用 Django 客户端):
response = self.client.post('/',
data={'reading': False,
'investing': True,
'traveling': True})
response = self.client.post('/', {'personal_interests': ['3', '1']})
也尝试作为一个元组:
response = self.client.post('/', {'personal_interests': ('3', '1'),})
但是这些都没有,似乎发送了我想要发送的数据。
提前致谢。
视图.py:
def home_page(request):
default_customer, _ = Customer.objects.get_or_create(name="John", surname="Doe")
default_customer.interests.clear()
form = InterestsForm()
if request.method == 'POST':
form = InterestsForm(request.POST)
if form.is_valid():
for key, value in form.cleaned_data.items():
for interest in value:
filtered_interest, _ = Category.objects.get_or_create(name=interest)
default_customer.interests.add(filtered_interest)
default_customer.save()
return redirect('/user/'+str(default_customer.id)+'/interests')
else:
messages.error(request, "An error has occured. Check all the fields.")
return redirect('/')
context = {'form': form}
return render(request, 'home.html', context)
forms.py:
class InterestsForm(forms.Form):
personal_interests = forms.ModelMultipleChoiceField(
widget=forms.CheckboxSelectMultiple,
queryset=Category.objects.all().order_by('name'),
required=False,
label='Interests')
class Meta:
model = Category
解决方案
我已经知道错误在哪里......测试数据库和普通数据库是不同的,所以我在测试时缺少在数据库中创建的对象。
所以我需要做的就是创建项目,然后发送 POST
response = self.client.post('/', {'personal_interests': ['3', '1']})
WORKS,其中“3”和“1”是对象的 pks。
这是固定代码。
def test_can_save_a_POST_request(self):
Customer.objects.get_or_create(name="John", surname="Doe")
reading_interest, _ = Category.objects.get_or_create(name="reading")
investing_interest, _ = Category.objects.get_or_create(name="investing")
traveling_interest, _ = Category.objects.get_or_create(name="traveling")
post_data = {'personal_interests': [str(investing_interest.id),
str(traveling_interest.id)]}
response = self.client.post('/',
data=post_data)
new_customer = Customer.objects.first()
customer_interests = [category.name for category in new_customer.interests.all()]
self.assertNotIn('reading', customer_interests)
self.assertIn('traveling', customer_interests)
self.assertIn('investing', customer_interests)
推荐阅读
- docker - 具有 sudo 权限的 docker 只能从 Internet 访问
- c++ - 在 C++ 接口声明中使用关键字
- java - 为什么授权不起作用并且无法访问页面?
- excel - VBA代码循环浏览文件夹中的文件
- javascript - 从字符串中获取html代码并以角度显示
- python - 如何从包含 nan 的熊猫数据框中删除行
- python - 文本提取:退出代码 127 失败 // windows 10 // pdftotext
- python - 如何在python中匹配多个单词
- css - 在 Hugo Academic 中购买的字体未在所有现代浏览器/计算机上显示
- reactjs - 在 StackOverFlow 代码片段中使用 React Hook