我想在我的网站上创建一个页面,用户可以在其中选择将产品添加到新创建的商店列表中的食谱。
但是,页面上有很多内容,在选择配方后,页面上的很多区域需要更新。
到目前为止,该页面的功能是: 1.制作商店列表 2.向用户显示相关值 3.根据提交的值向用户显示已过滤的配方列表 4.使用所选配方中的值
更新页面上的值将来我需要实现更多的功能,如果我这样离开,我很确定我的代码会变得一团糟。
我将用我所做的争吵总结我的目标和当前的问题:
加载页面时必须制作商店列表。该商店列表对用户不可见。只有几个值。
我想显示值'预算'和'dagen'。我为此创建了一个上下文,现在在两个视图中都是相同的。据我所知,这不是很好的DRY代码。我怎样才能以一种好的方式重写它?
在页面上将显示食谱列表。但是,两个视图之间的情况也大致相同。也不是DRY代码(对吗?)如何以一种好的方式重写这部分?
两个函数都呈现相同的模板。这也不是很好的DRY代码(对吧?)
我的想法:
我正在考虑通过单独扩展来解决2和3中提到的问题,这些扩展可以自己更新。但是,我需要存储在shoplist中的值来正确更新这些值。
我想我可以制作一个单独的功能来制作我可以从另一个功能调用的商店列表,但我需要一些存储在商店列表中的值。如果它们在另一个函数中,我如何获得这些值?
以下是两个功能:
选择功能:
@login_required(login_url='/')
def choose(request):
if request.method == 'POST':
"""
Make a shoplist model instance and populate it with BudgetForm value data
"""
shoplist = Shoplist()
shoplist.title = str(make_aware(datetime.now(), timezone=None, is_dst=None))
shoplist.author = request.user
shoplist.slug = slugify(str(shoplist.author) + '-' + shoplist.title)
shoplist.budget = request.POST.get('budget')
shoplist.dagen = request.POST.get('dagen')
shoplist.vegetarisch = request.POST.get('vegetarisch')
shoplist.winkel = request.POST.get('winkel')
shoplist.save()
if shoplist.vegetarisch == True:
recipes = Recipe.objects.filter(vegetarisch=True).all()
else:
recipes = Recipe.objects.all()
budget = shoplist.budget
dagen = shoplist.dagen
template = loader.get_template('recipes/choose.html')
c = {'object_list': recipes, 'budget': budget, 'dagen': dagen}
return HttpResponse(template.render(c))
else:
return HttpResponseNotAllowed('GET')
add_to_shoplist功能:
@login_required(login_url='/')
def add_to_shoplist(request, slug):
# Get the shoplist that is made in the choose view and add the selected recipe
latest_list = Shoplist.objects.filter(author=request.user).latest('id')
current_recipe = Recipe.objects.filter(slug=slug).get()
latest_list.recipes.add(current_recipe.id)
# Add the ingredients of the selected recipe to the shoplist
for ingredient in current_recipe.ingredients.all():
list_ingredient = ingredient
latest_list.ingredients.add(list_ingredient.id)
template = loader.get_template('recipes/choose.html')
if Shoplist.objects.filter(author=request.user).latest('id').vegetarisch == True:
recipes = Recipe.objects.filter(vegetarisch=True).all()
else:
recipes = Recipe.objects.all()
budget = latest_list.budget
dagen = latest_list.dagen
total_price =latest_list.total_price
recipe_added = latest_list.recipes.all()
c = {'object_list': recipes, 'budget': budget, 'dagen': dagen, 'total_price': total_price, 'recipes_added_list': recipe_added}
return HttpResponse(template.render(c))