日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Django自定義YamlField實(shí)現(xiàn)過程解析

瀏覽:66日期:2024-09-19 17:47:28

需求

在使用django admin時(shí)希望后臺(tái)的Textarea多行文本框可以按yaml格式編寫,數(shù)據(jù)庫保存為Text文本類型,字段和接口中讀取出來自動(dòng)變?yōu)樽值浠蛄斜砀袷健?/p>

試過pip install django-yamlfied,修改支持新版django之后

接口中返回的字段是字符串形式,不符合預(yù)期。

之前寫過一版。

import yamlfrom django.db import modelsclass YamlField(models.TextField): def to_python(self, value): # 將數(shù)據(jù)庫內(nèi)容轉(zhuǎn)為python對(duì)象時(shí)調(diào)用 if not value: value = {} if isinstance(value, (list, dict)): return value return yaml.safe_load(value) def get_prep_value(self, value): # create時(shí)插入數(shù)據(jù), 轉(zhuǎn)為字符串存儲(chǔ) return value if value is None else yaml.dump(value, default_flow_style=False) def from_db_value(self, value, expression, connection): # 從數(shù)據(jù)庫讀取字段是調(diào)用 return self.to_python(value)

問題是輸入框輸入

- a- b- c

保存后就會(huì)變成字典的字符串形式

[’a’,’b’,’c’]

無法原樣保存,反復(fù)研究后,參考django-jsonfield寫了一版。

原理是,改為繼承models.Field類,(繼承models.TextField類,則formfield和value_to_string不生效)

數(shù)據(jù)庫依舊將數(shù)據(jù)庫中的yaml文本轉(zhuǎn)為dict/list,在django admin中通過自定義widget顯示為yaml字符串格式。

為了保存時(shí),驗(yàn)證表單中yaml字符串格式是否正確,還需要自定義一個(gè)form。完整代碼如下。

import djangofrom django.db import modelsfrom django import formsfrom django.core.exceptions import ValidationErrorimport yamlclass YamlWidget(forms.Textarea): def render(self, name, value, attrs=None, renderer=None): if value is None: value = '' if not isinstance(value, str): value = yaml.safe_dump(value, default_flow_style=False) if django.VERSION < (2, 0): return super().render(name, value, attrs) return super().render(name, value, attrs, renderer)class YamlFormField(forms.CharField): empty_values = [None, ’’] def __init__(self, *args, **kwargs): if ’widget’ not in kwargs: kwargs[’widget’] = YamlWidget super().__init__(*args, **kwargs) def to_python(self, value): if isinstance(value, str) and value: try:return yaml.safe_load(value) except Exception as exc:raise forms.ValidationError(’Yaml decode error: %s’ % (exc.args[0],)) else: return value def validate(self, value): if value in self.empty_values and self.required: raise forms.ValidationError(self.error_messages[’required’], code=’required’)class YamlField(models.Field): description = 'Yaml object' def get_internal_type(self): return ’TextField’ def formfield(self, **kwargs): defaults = { ’form_class’: YamlFormField, ’widget’: YamlWidget } defaults.update(**kwargs) return super().formfield(**defaults) def to_python(self, value: str): # 將數(shù)據(jù)庫內(nèi)容轉(zhuǎn)為python對(duì)象時(shí)調(diào)用 if value is None: if not self.null and self.blank:return '' return None if isinstance(value, (list, dict)): return value value = yaml.safe_load(value) return value def validate(self, value, model_instance): # 驗(yàn)證從接受到字典格式 if not self.null and value is None: raise ValidationError(self.error_messages[’null’]) try: self.get_prep_value(value) except ValueError: raise ValidationError(self.error_messages[’invalid’] % value) def get_prep_value(self, value: (list, dict)): # 保存時(shí)插入數(shù)據(jù), 轉(zhuǎn)為字符串存儲(chǔ) if value is None: return None value = yaml.safe_dump(value, default_flow_style=False) return value def from_db_value(self, value: str, expression, connection, *args, **kwargs): # 從數(shù)據(jù)庫讀取字段是調(diào)用 return self.to_python(value) def value_to_string(self, obj): # Rest Framework調(diào)用時(shí) return self.value_from_object(obj)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品1区| 久久国产精品亚洲77777| 99在线精品免费视频九九视| 国产精品99久久免费| 精品一区二区三区在线观看视频| 国产精品亚洲综合久久| 四虎精品一区二区免费| 欧美一区影院| 国产精品久久久久久久免费观看| 高清一区二区三区| 久久精品高清| 国产精品精品| 欧美91福利在线观看| 在线精品一区二区| 国产美女久久| 色吊丝一区二区| 四虎精品永久免费| 久久精品午夜| 视频一区二区国产| 麻豆精品av| 日韩av在线免费观看不卡| 美国三级日本三级久久99| 国产亚洲精品美女久久| 久久精品99久久无色码中文字幕| 热久久国产精品| 高清久久一区| 日韩在线观看一区二区三区| 精品久久91| 亚洲人成网站在线在线观看| 鲁大师精品99久久久| 久久久久网站| 国产精品15p| 国产女优一区| 桃色av一区二区| 国产精品一区二区三区四区在线观看 | 色婷婷精品视频| 每日更新成人在线视频| 欧美韩一区二区| 中文一区一区三区免费在线观 | 日韩欧美久久| 欧美.日韩.国产.一区.二区| 国产精品久久久久77777丨| 国产精品亚洲一区二区在线观看| 亚洲免费中文| 日韩在线观看不卡| 国产精品久久久久久模特| 亚洲欧美日韩国产| 视频福利一区| 精品国产成人| 美女在线视频一区| 日韩激情一区二区| 成人看片网站| 正在播放日韩精品| 精品久久国产一区| 美女视频黄免费的久久| 国产亚洲人成a在线v网站| 91欧美极品| 国产精品毛片久久久| 欧美激情 亚洲a∨综合| 国产精品日本一区二区三区在线| 亚洲精品福利| 日韩午夜av在线| 丝袜美腿亚洲一区| 西西人体一区二区| 免费精品视频最新在线| 伊人www22综合色| 日韩二区三区四区| 91亚洲精品在看在线观看高清| 日本欧美在线| 荡女精品导航| 美女网站视频一区| 成人久久一区| 在线日韩成人| 久久中文字幕导航| 欧美久久天堂| 欧美日韩日本国产亚洲在线| 一区二区电影| 精品国产一区二区三区av片| 色综合www| 亚洲精品在线二区| 久久这里只有精品一区二区| 国产亚洲一卡2卡3卡4卡新区| 你懂的亚洲视频| 99视频精品| 久久三级毛片| 日韩一区精品字幕| 国产精品久久久久久av公交车| 欧洲亚洲一区二区三区| 日韩欧美美女在线观看| 日韩中文视频| 日韩在线观看一区二区| 中文一区二区| 国产剧情一区| 日韩午夜高潮| 国产精品久久久久蜜臀 | 婷婷综合福利| 亚洲韩日在线| 久久精品二区亚洲w码| 久久成人一区| 老司机精品视频网| 红桃视频欧美| 91av亚洲| 麻豆精品视频在线观看| 久久精品二区三区| 国产欧美丝祙| 亚洲欧洲国产精品一区| 欧洲av一区二区| 精品免费av一区二区三区| 日韩区一区二| 免费在线观看不卡| av亚洲免费| 一区二区三区四区在线观看国产日韩| 另类小说一区二区三区| 午夜久久av| 9色精品在线| 免费高潮视频95在线观看网站| 免费一区二区三区在线视频| 日韩黄色免费网站| 黄色免费成人| 欧美成人精品| 国产精品99一区二区| 欧美日韩中文| 亚洲资源网站| 亚洲一区欧美| 日韩精品久久久久久| 日本一区免费网站| 中文字幕日本一区二区| 免费成人av在线播放| 香蕉成人久久| 久久福利精品| 日韩精品导航| 久久超级碰碰| 天堂√8在线中文| 国产精品中文字幕亚洲欧美| 97久久亚洲| 精品亚洲自拍| 99精品视频在线| 亚洲激情黄色| 日本亚洲欧美天堂免费| 国产精品白丝一区二区三区| 老司机精品视频在线播放| 欧美久久天堂| 蜜桃视频在线观看一区| 91嫩草精品| 国产精品亚洲欧美日韩一区在线| 热久久久久久| 蜜桃成人精品| 日韩中文字幕视频网| 日韩av三区| 日韩欧美在线中字| 一区二区三区午夜视频| 美女性感视频久久| 午夜免费一区| 欧美亚洲tv| 91精品推荐| 久久不卡国产精品一区二区| 中文在线а√在线8| 中文字幕日本一区二区| 精品网站999| 婷婷亚洲成人| 影音先锋久久| 国产999精品在线观看| 快she精品国产999| 国产精品久av福利在线观看| 欧美91视频| 国产 日韩 欧美 综合 一区| 亚洲精品美女91| 美女在线视频一区| 视频一区二区三区中文字幕| 国模大尺度视频一区二区| 亚洲另类av| 99日韩精品| 极品日韩av| 日韩欧美看国产| 国产一区日韩| 欧美国产另类| 国产探花一区在线观看| 偷拍亚洲精品| 麻豆久久精品| 在线看片国产福利你懂的| 日韩精品一区二区三区av | 亚洲爱爱视频| 岛国av免费在线观看| 国产亚洲字幕| 麻豆国产精品一区二区三区| 欧美日本二区| 欧美日韩a区| 国产伦精品一区二区三区在线播放| 亚洲综合二区| 婷婷综合网站| 午夜精品成人av| 国产99久久| 国产韩日影视精品| 国产精品美女久久久浪潮软件| 亚洲国产成人精品女人| 国产亚洲激情| 蜜桃久久久久久| 日本成人在线不卡视频| 欧美综合社区国产| 国产精品高潮呻吟久久久久|