Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何避免Django中基于函数的视图中的代码重复?_Python_Django_Django Views - Fatal编程技术网

Python 如何避免Django中基于函数的视图中的代码重复?

Python 如何避免Django中基于函数的视图中的代码重复?,python,django,django-views,Python,Django,Django Views,我一直在研究如何避免反复使用代码片段。答案可能涉及使用基于类的函数。然而,我是Django的初学者,这似乎令人困惑。以下是我在views.py中的视图: @login_required(login_url='/login') def view_list(request, listing_id): bid = Bid.objects.all().filter(listing=listing_id).order_by('-id') b_u = bid[0].user listing = Listin

我一直在研究如何避免反复使用代码片段。答案可能涉及使用基于类的函数。然而,我是Django的初学者,这似乎令人困惑。以下是我在views.py中的视图:

@login_required(login_url='/login')
def view_list(request, listing_id):
bid = Bid.objects.all().filter(listing=listing_id).order_by('-id')
b_u = bid[0].user
listing = Listing.objects.get(pk=listing_id)

if request.method == "GET":
    return render(request, "auctions/view_list.html", {
        "form": BidForm(),
        "total_bids": bid.count(),
        "bid":  None if bid == 0 else bid[0].bid,
        "listing": listing,
        "bid_user": "Your bid is the current bid." if request.user == b_u else None
    })
else:
    form = BidForm(request.POST)
    if form.is_valid():
        value = form.cleaned_data
        if value['bid'] <= bid[0].bid:
            error_check = True
            return render(request, "auctions/view_list.html", {
                "error_check": error_check,
                "alert": f"Your bid is lower than the current bid $({bid[0].bid})! Try placing a higher one.",
                "form": BidForm(),
                "total_bids": bid.count(),
                "bid":  None if bid == 0 else bid[0].bid,
                "listing": listing,
                "bid_user": "Your bid is the current bid." if request.user == b_u else None
            })
        else:
            error_check = False
            new_bid = form.save(commit=False)
            new_bid.user_id = request.user.id
            new_bid.listing_id = listing.id
            new_bid.save()
            return render(request, "auctions/view_list.html", {
                "error_check": error_check,
                "alert": "Your bid was successfully placed!",
                "form": BidForm(),
                "total_bids": bid.count(),
                "bid":  None if bid == 0 else bid[0].bid,
                "listing": listing,
                "bid_user": "Your bid is the current bid." if request.user == b_u else None
            })
@login\u必需(login\u url='/login')
def视图列表(请求、列表id):
bid=bid.objects.all().filter(listing=listing_id).order_by('-id'))
b_=bid[0]。用户
listing=listing.objects.get(pk=listing\u id)
如果request.method==“GET”:
返回渲染(请求“auctions/view_list.html”{
“形式”:BidForm(),
“总出价”:bid.count(),
“投标”:如果投标=0,则无其他投标[0]。投标,
“上市”:上市,
“出价用户”:“您的出价是当前出价。”如果request.user==b\u else无
})
其他:
表单=投标表单(request.POST)
如果form.is_有效():
值=form.u数据

如果value['bid']则模式非常简单

def some_视图(请求):
form=SomeForm(request.POST或None)
如果request.method==“POST”和form.is\u有效():
#表格处理
返回渲染(请求“auctions/view_list.html”{
“形式”:形式
})

这是如何回答上述问题的?您可以减少代码的重复。问题是什么?也就是说,现在只有1次返回,而不是3次返回render(…)函数。在我看来,它减少了代码重复。很抱歉,如果我没有正确理解你的问题。是的,这就是问题所在,但我要寻找的答案并不是只修剪代码而不维护逻辑。事实上,我保留了你的逻辑。使代码更加稳定和安全。也就是说,我的代码可以处理PUT/DELETE/PATCH请求类型,但您的代码不能。请尝试用我的模式重写代码,也许你明白我的意思。如果不是,你会在1-2年后理解。我对Django有10多年的经验,我知道我在说什么。相信这个答案,祝你编码好运:-)嗯,现在我明白了,很抱歉!这就是当我期待一个更复杂的答案时会发生的事情,当魔鬼在细节中时。谢谢