【发布时间】:2021-05-28 13:04:19
【问题描述】:
我有一些代码必须重复用于多个视图,所以我想创建一个装饰器,这样我就不必复制和粘贴多行代码。
所以我需要在不同视图中重用的代码是:
@login_required
def add_custom_word_song(request, target_word, source_word, pk):
"""
Add new word
"""
if request.method == 'POST':
form = WordForm(request.POST)
if form.is_valid():
deck_name = form.cleaned_data['deck_name']
source_word = form.cleaned_data['source_word']
target_word = form.cleaned_data['target_word']
fluency = form.cleaned_data['fluency']
user = request.user
Word.objects.create(user=user, target_word=target_word,
source_word=source_word, deck_name=deck_name, fluency=fluency)
return HttpResponseRedirect(reverse('vocab:list'))
if request.method =="GET":
user = request.user
request.session['pk'] = pk
form = CustomWordForm(initial={'user': user, 'target_word': target_word, 'source_word': source_word, 'deck_name': 'My Words', 'fluency': 0})
return render(request, 'vocab/add_custom_initial_song.html', {'form': form, 'pk': pk})
对于其他视图,唯一会更改的代码部分是最后一行中的模板部分。所以我试着把除了最后一行之外的所有东西都放在装饰器中,但后来我得到了:
TypeError: add_custom_word() missing 3 required positional arguments: 'target_word', 'source_word', and 'pk'
我尝试了不同的变体,但仍然得到相同的错误。
【问题讨论】:
-
似乎您正在尝试重新发明轮子。看docs.djangoproject.com/en/3.1/topics/class-based-views
-
我知道基于类的视图,但在这种情况下似乎没有合适的视图? @Oussama
-
您可以继承并适应您的需求。无论如何,错误消息中的函数名称在您共享的代码中不存在。 add_custom_word() 在哪里被调用?
-
这就是我所说的装饰器(代码和上面一样,只是名字不同)
-
你能分享你的装饰器代码吗?问题不在上面的代码中
标签: python python-3.x django django-views decorator