想請教各位,我目前遇到這個 陣列問題 想不出來要怎麼解 @@
我輸入一筆"編號",有相同編號的資料,就存進檔案下載
但只有我輸入兩筆以上不同的"編號",就會報錯,無法輸出存檔
只輸入一筆"編號"篩選資料條件,可以匯出檔案
輸入兩筆以上的"編號"篩選資料條件,就會報錯
程式碼:
Views:
def down_file(request):
ssid = CourseData.objects.all()
if request.method == "POST":
sids = request.POST.get("sids").strip()
if "," in sids:
dfs = CourseData.objects.filter(sid = "NA")
sdfs = sids.split(",")
for n in sdfs:
sdfses = CourseData.objects.filter(sid = n.strip())
dfs = dfs | sdfses
else :
dfs = CourseData.objects.filter(sid__in = [sids]).values_list("sid","name","phone","email","sdept")
response = HttpResponse(content_type = "text/csv")
response.write(codecs.BOM_UTF8)
response['Content-Disposition'] = 'attachment; filename = "Report.csv" '
writer = csv.writer(response)
writer.writerow(["編號","姓名","手機","信箱","單位"])
#for df in dfs:
writer.writerows(dfs)
return response
我覺得你完全沒搞懂 filter 怎麼用...
searchIDs1 = []
searchIDs2 = [1]
searchIDs3 = [1, 3, 5]
# 永遠傳回 <QuerySet []>
result1 = CourseData.objects.filter(id__in=searchIDs1)
# 傳回 id = 1/3/5的 <QuerySet [1]>
result2 = CourseData.objects.filter(id__in=searchIDs2)
# 傳回 id = 1/3/5的 <QuerySet [1, 3, 5]>
result3 = CourseData.objects.filter(id__in=searchIDs3)
上面的圖片是主管寫的code,丟下來要依照他提的功能需求去改,給完code後就不管,他也沒空討論也不想討論;我就先照著這份code去改成篩選"編號".
再者,這一個多月被要求轉來改用py寫網頁,因本來就不是學py,很多都還不是很熟悉.
但還是謝謝您的熱心建議與指導.
你主管丟code不管你是他的事,不過要我我也是丟文件給你自己看。
如果你已經是有其他語言的經驗了,我真的覺得你已經搞一個月了,不該還在問這種問題,尤其是python本身已經是很容易理解的語言了,debug訊息又特別清楚,Django文件也很清楚的狀況下。
我自己是在什麼都不會的狀況下自學程式語言,除了python以外,go也自學、php、node沒想學但是看到會改。基礎打得好,要學其他語言都很快、基礎打不好,就會遇到像這種一出問題就不知道怎麼去解的狀況。
我是建議你靜下心來,先把
https://docs.djangoproject.com/zh-hans/4.0/intro/
看完,練習一下debug,再繼續後面的工作。
試試看
def search_by_name(request):
departments = Departmetn.objects.all()
cdepartments = CDepartment.objects.all()
if request.method = "POST":
psid = request.POST.get("sid").strip()
if "," in psid:
courses = CourseData.objects.filter(sid="NA")
sids = psid.split(",")
for s in sids:
course = CourseData.objects.filter(sid=s.strip())
courses = courses | course
else:
courses = CourseData.objects.filter(sid=psid).order_by("dept")
num = len(courses)
return render(request, "index.html")
return redirect("/")
合則用不合則算
不用這麼麻煩啦,__in就可以處理所有單選多選的狀況了,只要對傳來的post做確認不是None,然後做split(),變成list,傳給filter做篩選就好。
前面多選的部分...
def search_by_name(request):
departments = Departmetn.objects.all()
cdepartments = CDepartment.objects.all()
if request.method = "POST":
psid = request.POST.get("sid").strip().split()
defaultCourse = CourseData.objects.filter(sid="NA")
courses = CourseData.objects.filter(sid__in=psid)
courses = courses | defaultCourse
num = len(courses)
return render(request, "index.html")
return redirect("/")