stark组件开发之添加功能实现
添加功能,還是使用, form 組件來完成!? 并且 完成添加之后,需要保留原搜索條件。
def memory_url(self):'''用于反向生成url, 并且攜帶,get請求的參數(shù),跳轉(zhuǎn)到下一個網(wǎng)頁'''name = "%s:%s" % (self.site.namespace, self.get_add_url_name)base_url = reverse(name)# 記錄原搜索條件if not self.request.GET:add_url = base_urlelse:param = self.request.GET.urlencode() # 獲取到GET請求的,所有的參數(shù)。 ?page=1&age=20new_query_dict = QueryDict(mutable=True)new_query_dict["_filter"] = paramadd_url = "%s?%s" % (base_url, new_query_dict.urlencode())return add_url通過這個函數(shù), 已經(jīng)在。 展示頁面, 為 添加按鈕,指定了? URL。
進入添加頁面之后, 已經(jīng)攜帶著,? 展示頁面的 GET 請求的信息。 進入了 添加頁面。
那么,添加完成之后。 跳轉(zhuǎn)回, 展示頁面的時候。 也需要將 GET 信息。 原封不動的,帶回 展示頁面。
先看? 添加頁面的 基礎(chǔ)需求:
因為,所有的添加頁面, 都是使用的同一個 模板。 來完成。。。? 可以使用 form 組件來完成這件事。
因為在基類中, 初始化函數(shù)中, 定義了? model_class? 這個就是, 各自的 模型表的類。
默認(rèn)顯示? “__all__"??? 并返回。 這個form 類。? 并且預(yù)留了接口。 model_form_class
看一看: 添加的視圖:
def add_view(self, request):'''添加頁面:param request::return:'''model_form_class = self.get_model_form_class()if request.method == "GET":form = model_form_class()return render(request, "stark/change.html", {"form": form})form = model_form_class(data=request.POST)if request.method == "POST":if form.is_valid():# form.save()return redirect(self.memory_reverse())return render(request, "stark/change.html", {"form": form})可以看到, 再添加的視圖中。 我們通過調(diào)用self.get_model_form_class()? 來得到。 form 類。 并傳遞給了 模板。
當(dāng)預(yù)留的接口,沒有值得時候, 使用得就是,默認(rèn)得全部顯示。|
如果需要,進行自定制,也是可以的。? 這就需要在。 子類中為? model_form_class = None 這個預(yù)留得接口。 為他賦一個值。
這個值,就是一個。 自己重寫之后得,form 類。
比如: 在原來得基礎(chǔ)上。 再添加上一個字段。
class UserInfoModelForm(StarkModelForm):xx = forms.CharField()class Meta:model = models.UserInfofields = "__all__"class UserInfoHandler(StartHandler):list_display = ["name", "age", "depart", get_choice_txt("性別", "gender"), StartHandler.display_edit,StartHandler.display_del]per_page = 1 # 重訂 每頁顯示 多少 數(shù)據(jù)has_add_btn = Truemodel_form_class = UserInfoModelForm寫一個form類。 并且多了一個? xx 得字段。
然后將這個類, 賦值給了 model_form_class?? 這樣。 對象再去找這個變量得時候。 因為優(yōu)先找自己得類, 也就是? UserInfoHandler
發(fā)現(xiàn)有這個? model_form_class? ,然后他就會使用這個變量。
在調(diào)用self.get_model_form_class() 得時候。 內(nèi)部進行了判斷。 這個model_form_class 不為空。 就直接 return 了 model_form_class
這樣,在 添加視圖中, 接收到得, 就是。 添加了 xx 字段得 。 這個 form 類。
在頁面顯示得 時候。 就能夠,看到這個類!
添加字段可以了。 那么如何減少一個字段呢?
class UserInfoModelForm(StarkModelForm):class Meta:model = models.UserInfofields = ["name", "gender", "age", "depart"] # 原本全部的話 是需要再增加一個 pwd 的。fields? 不再 使用? "__all__"? 而是自己指定。 想要顯示得字段。
但是,有一個問題就是。 不顯示這個字段。 表示用戶不能進行輸入這個字段。
那么數(shù)據(jù)庫在進行保存得時候, 這個字段,沒有值, 他該怎么個保存??? 這樣就必須提供一個默認(rèn)得值
也就是說,現(xiàn)實的時候雖然收一個字段, 但是保存得時候,必須提供一個默認(rèn)得值:
所以在添加視圖函數(shù)中,再保存的,時候,我需要一個可以自定制的,保存功能。
先看代碼基類的代碼, 為了支持自定制的功能。 在基類中新增一個函數(shù) save()? 這個函數(shù)默認(rèn)使用 form.save():
.............
def save(self, form, is_update=False):form.save()def add_view(self, request):'''添加頁面:param request::return:'''model_form_class = self.get_model_form_class()if request.method == "GET":form = model_form_class()return render(request, "stark/change.html", {"form": form})form = model_form_class(data=request.POST)if request.method == "POST":if form.is_valid():
# 這里不再使用 form.save() 而是使用類中的save()函數(shù)。讓這個方法去幫我保存。
# 這樣的話,我在子類中,就可以進行。重寫 save 這個方法。 從而實現(xiàn),我想要默認(rèn)保存的 哪個字段self.save(form, is_update=False)return redirect(self.memory_reverse())return render(request, "stark/change.html", {"form": form})
............... class UserInfoModelForm(StarkModelForm):class Meta:model = models.UserInfofields = ["name", "gender", "age", "depart"]class UserInfoHandler(StartHandler):list_display = ["name", "age", "depart", get_choice_txt("性別", "gender"), StartHandler.display_edit,StartHandler.display_del] model_form_class = UserInfoModelFormdef save(self, form, is_update=False):form.instance.pwd = 123 # 通過instance 為想要的 字段。 制定一個默認(rèn)的保存 值。 我這里為 pwd 字段 默認(rèn)保存 123form.save() # 然后在這里進行 保存的工作。
這樣就可以為 一張表,進行自定制的,保存工作。? 并且只有 UserInfoHandler? 這個子類,重寫了 save 方法。
其他的子類。沒有重寫這個方法。 所以在不同的對象再找的時候, 之后UserInfoHandler? 的對象,能夠找到自己的 save 函數(shù)。 其他的依然使用的是, 父類的 save 函數(shù)。
這樣, 就不會相互的影響。
?
轉(zhuǎn)載于:https://www.cnblogs.com/chengege/p/10741154.html
總結(jié)
以上是生活随笔為你收集整理的stark组件开发之添加功能实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。