馃敟閭傞€匘jango-鍐呭鉁呯涓€閮ㄥ垎锛氥€愰倐閫匘jango銆戔€斺€旓紙涓€锛夊垱寤洪」鐩渽绗簩閮ㄥ垎锛氥€愰倐閫匘jango銆戔€斺€旓紙浜岋級鏁版嵁搴撻厤缃煕狅笍绗笁閮ㄥ垎锛歔MeetDjango]-(3)Views馃洜锔廝art4:[MeetDjango]-(4)Formsandgeneralviews馃洜锔廝art5:[MeetDjango]-(5)鏀硅繘鐣岄潰锛堣嚜瀹氫箟鐣岄潰鍜孲tyle锛夝煕狅笍绗叚閮ㄥ垎锛氥€愯璇咲jango銆戔€斺€旓紙鍏級鑷畾涔夌鐞嗙晫闈煕狅笍绗竷閮ㄥ垎锛氥€愯璇咲jango銆戔€斺€旓紙涓冿級鑷姩鍖栨祴璇曫煄堝墠瑷€鏈郴鍒楁枃绔狅紝鍦―jango瀹樻柟鏂囨。鏁欑▼鍩虹妯℃澘涓嬪埗浣滀竴浜涙敼杩涘拰鍒犻櫎锛屽鍔犱簡涓€浜涙垜鑷繁鐨勮瑙c€傚笇鏈涘ぇ瀹剁湅瀹屾湰绯诲垪鏂囩珷鍚庯紝鑳藉瀵笵jango鏈変竴涓竻鏅扮殑璁よ瘑銆傝矾婕极鍏朵慨杩滃叜锛屾垜灏嗕笂涓嬫眰绱紒Django==瀹樻柟鏂囨。==锛歨ttps://www.djangoproject.com/鉂椻潡鉂楀湪瀛︿範杩囩▼涓紝澶氱湅瀹樻柟鏂囨。鍙互瑙e喅寰堝闂鉂椻潡鉂楁湰鏁欑▼浣跨敤璇楁瓕鏉ョ鐞嗛」鐩幆澧冦€傜浉鍏宠瘲姝岀殑瀹夎鍜屼娇鐢ㄨ鍙傝€冦€怭ython-铏氭嫙鐜銆戦」鐩惎鍔紝浠庨殧绂诲紑鍙戠幆澧?SegmentFault寮€濮嬫€濆惁1.椤圭洰閰嶇疆鏂囦欢settings.py馃寠1.1鏁版嵁搴撻厤缃甿ysite/settings.py鏄竴涓敤浜庨」鐩缃殑Django鍖呭惈鐨凱ython妯″潡銆傛暟鎹簱鐨勯厤缃綅浜庡彉閲廌ATABASES涓€侱jango榛樿浣跨敤SQLite浣滀负榛樿鏁版嵁搴撱€侾ython鍐呯疆浜哠QLite锛屽洜姝ゆ偍鏃犻渶瀹夎浠讳綍棰濆鐨勪笢瑗垮氨鍙互浣跨敤瀹冦€傚鏋滃仛涓€涓湡姝g殑椤圭洰锛屾渶濂戒笉瑕佷娇鐢⊿QLite銆?Django榛樿浣跨敤SQLiteDATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR/'db.sqlite3',}}#Django浣跨敤MySQL閰嶇疆DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'mysite',#浣跨敤MySQL鏃堕渶瑕佹彁鍓嶅湪MySQL涓垱寤簃ysite鏁版嵁搴?HOST':'127.0.0.1','PORT':3306,'USER':'root','PASSWORD':'******'}}鍙傛暟璇存槑锛歞efault:Django杩炴帴鏁版嵁搴撴椂锛岄粯璁や細閾炬帴鏁版嵁搴撻粯璁ゆ儏鍐典笅銆侲NGINE锛氭湁澶氫釜鍙€夊€糳jango.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysqldjango.db.backends.oracle绛夌涓夋柟鏁版嵁搴撳悗绔€傚紩鐢ㄥ湴鍧€NAME锛氭暟鎹簱鐨勫悕绉般€傚鏋滀娇鐢⊿QLite锛屾暟鎹簱灏嗘槸鎮ㄨ绠楁満涓婄殑涓€涓枃浠躲€傞粯璁ゆ儏鍐典笅锛孊ASE_DIR/'db.sqlite3'浼氬皢鏁版嵁搴撳瓨鍌ㄥ湪椤圭洰鐨勬牴鐩綍涓嬨€傚叾浠栧弬鏁帮細濡傛灉涓嶄娇鐢⊿QLite锛屽垯蹇呴』娣诲姞涓€浜涢澶栫殑璁剧疆锛屽USER銆丳ASSWORD銆丠OST绛夈€傚弬鑰冩枃妗f敞鎰忥細濡傛灉浣跨敤SQLite浠ュ鐨勬暟鎹簱锛屼娇鐢ㄥ墠闇€瑕佺‘璁ゆ暟鎹簱宸茬粡鍒涘缓銆傚彲浠ヤ娇鐢–REATEDATABASEdatabase_name鏉ュ垱寤烘暟鎹簱锛涘湪鎮ㄧ殑鏁版嵁搴撲氦浜掑紡鍛戒护琛屼笂銆傪煂?.2鏃跺尯鍜岃瑷€鎮ㄥ彲浠ュ湪settings.py鏂囦欢涓慨鏀规椂鍖哄拰璇█銆?LanguageLANGUAGE_CODE="zh-hans"#TimezoneTIME_ZONE="Asia/Shanghai"馃寠1.3Django榛樿鑷甫鐨勫簲鐢ㄧ▼搴忛厤缃枃浠秙ettings.py鏂囦欢涓殑涓€浜涜鏄庯細INSTALLED_APPSINSTALLED_APPS榛樿鍖呮嫭浠ヤ笅Django鑷甫鐨勫簲鐢ㄧ▼搴忥細django.contrib銆俛dmin锛氱鐞嗗憳绔欑偣django.contrib.auth锛氳璇佹巿鏉冪郴缁焏jango.contrib.contenttypes锛氬唴瀹圭被鍨嬫鏋禿jango.contrib.sessions锛氫細璇濇鏋禿jango.contrib.messages锛氭秷鎭鏋禿jango.contrib.staticfiles锛氱鐞嗛潤鎬佹枃浠剁殑妗嗘灦涓€浜涢粯璁ゅ惎鐢ㄧ殑搴旂敤绋嬪簭鑷冲皯闇€瑕佷竴涓暟鎹〃锛屽洜姝ゅ湪浣跨敤瀹冧滑涔嬪墠闇€瑕佸湪鏁版嵁搴撲腑鍒涘缓涓€浜涜〃銆傞渶瑕佹墽琛屼互涓嬪懡浠わ細pythonmanage.pymigrate2.鍒涘缓妯″瀷瀹氫箟妯″瀷锛屽嵆鏁版嵁搴撶粨鏋勮璁″拰鍏朵粬闄勫姞鍏冩暟鎹€傚湪姝ゆ姇绁ㄥ簲鐢ㄧ▼搴忎腑锛岄渶瑕佸垱寤轰袱涓ā鍨嬶細闂鍜岄€夋嫨銆傞棶棰樻ā鍨嬪寘鎷棶棰樻弿杩板拰鍙戝竷鏃堕棿銆侰hoice妯″瀷鍖呮嫭閫夐」鎻忚堪鍜屽綋鍓嶆姇绁ㄦ暟銆傛瘡涓€夐」閮藉睘浜庝竴涓棶棰樸€?polls/models.pyfromdjango.dbimportmodelsclassQuestion(models.Model):question_text=models.CharField(max_length=200)pub_date=models.DateTimeField("publisheddate")绫婚€夋嫨(models.Model):question=models.ForeignKey(Question,on_delete=models.CASCADE)choice_text=models.CharField(max_length=200)votes=models.IntegerField(default=0)鍒涘缓妯″瀷锛岀户鎵縟jango.db.models.Model锛涙瘡涓ā鍨嬮兘鏈夊緢澶氱被鍙橀噺锛岄兘浠h〃妯″瀷涓殑涓€涓暟鎹〃瀛楁銆傛瘡涓瓧娈甸兘鏄疐ield绫荤殑涓€涓疄渚嬨€傝鏄庯細Django鍙互涓哄簲鐢ㄧ▼搴忓垱寤烘暟鎹簱琛紙CREATETABLE锛塂jango鍙互鍒涘缓涓嶲uestion鍜孋hoice瀵硅薄浜や簰鐨凱ython鏁版嵁搴揂PI3.婵€娲绘ā鍨婦jango搴旂敤绋嬪簭鏄€滃彲鎻掑叆鐨勨€濄€傛坊鍔犳姇绁ㄥ簲鐢ㄧ▼搴?mysite/settings.pyINSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls',#or'polls.apps.PollsConfig',]鐜板湪锛孌jango椤圭洰宸茬粡鍖呭惈浜唒olls搴旂敤绋嬪簭銆傝繍琛屽懡浠akemigrations鎵ц杩佺Щ锛歱ythonmanage.pymakemigrations杩愯makemigrations鍛戒护锛孌jango浼氭娴嬫ā鍨嬫枃浠剁殑淇敼锛屽苟灏嗕慨鏀圭殑閮ㄥ垎瀛樺偍涓鸿縼绉汇€傝縼绉绘槸Django瀵规暟鎹粨鏋勫彉鍖栫殑瀛樺偍銆俶igrate鏄竴涓嚜鍔ㄦ墽琛屾暟鎹簱杩佺Щ鍜屽悓姝ョ鐞嗘暟鎹簱缁撴瀯鐨勫懡浠ゃ€傛墍浠ワ紝鍦ㄦ墽琛宮akemigrations涔嬪悗锛屽鏋滄兂鍦ㄦ暟鎹簱涓繘琛屼慨鏀瑰拰鍚屸€嬧€嬫锛岄渶瑕佸啀娆℃墽琛宲ythonmanage.pymigrate銆傝縼绉绘槸涓€涓潪甯稿己澶х殑鐗规€э紝鍙互鍦ㄥ紑鍙戣繃绋嬩腑涓嶆柇鏀瑰彉鏁版嵁搴撶粨鏋勶紝鑰屾棤闇€鍒犻櫎鍜岄噸鏂板垱寤鸿〃銆傚畠涓撴敞浜庡钩婊戠殑鏁版嵁搴撳崌绾ц€屼笉浼氫涪澶辨暟鎹€傛洿鏀规ā鍨嬮渶瑕佷互涓嬫楠わ細缂栬緫models.py鏂囦欢锛屾洿鏀规ā鍨嬶紝杩愯pythonmanage.pymakemigrateions鐢熸垚妯″瀷鏇存敼鐨勮縼绉绘枃浠讹紝杩愯pythonmanage.pymigrate锛屽簲鐢ㄦ暟鎹簱杩佺Щ4.鍒濊瘯API馃寠4.1Django浜や簰鍛戒护鐨勫熀鏈娇鐢―jango浜や簰鍛戒护琛岋細pythonmanage.pyshell>>>frompolls.modelsimportChoice,Question#鏌ョ湅Question琛ㄤ腑鐨勬暟鎹?>>Question.objects.all()#褰撳墠娌℃湁鏁版嵁>>>fromdjango.utilsimporttimezone#鍒涘缓涓€涓棶棰樻暟鎹璞?>>q=Question(question_text="What'snew?",pub_date=timezone.now())#Store鏁版嵁搴撶殑鏁版嵁瀵硅薄>>>q.save()#鏌ョ湅q瀵硅薄灞炴€?>>q.id1>>>q.question_text鈥滀粈涔堟槸鏂扮殑锛熲€?>>q.pub_datedatetime.datetime(2022,3,20,11,29,15,780052,tzinfo=datetime.timezone.utc)#淇敼q瀵硅薄鐨勫睘鎬?>>q.question_text="What'sup?鈥?>>q.save()#鍐嶆鏌ョ湅Question琛ㄤ腑鐨勬暟鎹?>>Question.objects.all()]>瀵逛簬Question杩斿洖鐨勬樉绀烘暟鎹紝浣犲彲浠ラ€氳繃缂栬緫Question妯″瀷浠g爜鏉ヤ慨鏀癸紝鍦≦uestion鍜孋hioce涓坊鍔燺_str__()鏂规硶銆傜被闂锛坢odels.Model锛夛細question_text=models.CharField锛坢ax_length=200锛塸ub_date=models.DateTimeField锛堚€滃彂甯冩棩鏈熲€濓級def__str__锛坰elf锛夛細杩斿洖self.question_text绫婚€夋嫨锛坢odels.Model锛夛細闂=妯″瀷.ForeignKey(Question,on_delete=models.CASCADE)choice_text=models.CharField(max_length=200)votes=models.IntegerField(default=0)def__str__(self):returnself.choice_text鍐嶆杩涘叆Django浜や簰鍛戒护琛岋細pythonmanage.pyshellQuestion.objects.all()]>馃寠4.2鍚戞ā鍨嬫坊鍔犺嚜瀹氫箟鏂规硶=models.CharField(max_length=200)pub_date=models.DateTimeField("PublishedDate")def__str__(self):returnself.question_textdefwas_published_recently(self):returnself.pub_date>=timezone.now()-鏃ユ湡鏃堕棿銆倀imedelta(days=1)classChoice(models.Model):question=models.ForeignKey(Question,on_delete=models.CASCADE)choice_text=models.CharField(max_length=200)votes=models.IntegerField(default=0)def__str__(self):returnself.choice_text鍐嶆杈撳叆Django浜や簰鍛戒护琛岋細pythonmanage.pyshell>>>frompolls.modelsimportQuestion,Choice#妫€鏌_str__()鏄惁鐢熸晥>>>Question.objects.all()]>#Django鏁版嵁搴揂PI锛氳繃婊ゅ櫒>>>Question.objects.filter(id=1)]>>>>fromdjango.utilsimporttimezone>>>current_year=timezone.now().year>>>Question.objects.get(pub_date__year=current_year)#濡傛灉鏁版嵁搴撲腑娌℃湁鏁版嵁锛屽垯鎶涘嚭寮傚父>>>Question.objects.get(id=2)Traceback锛堟渶杩戣皟鐢ㄦ渶鍚庯級锛氭枃浠垛€?input>鈥濓紝绗?琛岋紝鍦?module>鏂囦欢鈥淒:\Codes\media\django\code001\venv\lib\site-packages\django\db\妯″瀷\manager.py",line85,inmanager_methodreturngetattr(self.get_queryset(),name)(*args,**kwargs)File"D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\query.py",line496,ingetraiseself.model.DoesNotExist(polls.models.Question.DoesNotExist:Question鍖归厤鏌ヨ涓嶅瓨鍦ㄣ€?閫氳繃涓婚敭鑾峰彇鏁版嵁瀵硅薄>>>Question.objects.get(pk=1)>>>q=Question.objects.get(pk=1)#浣跨敤models.py涓殑鑷畾涔夋柟娉?>>q.was_published_recently()True#鏌ョ湅q瀵硅薄锛屽閿搴旂殑瀵硅薄>>>q.choice_set.all()#缁檘瀵硅薄娣诲姞澶栭敭鍏冪礌>>>q.choice_set.create(choice_text="Notmuch",votes=0)>>>q.choice_set.create(choice_text="Thesky",votes=0)>>>c=q.choice_set.create(choice_text="Justhackingagain",votes=0)#鏌ョ湅c鍏冪礌锛圕hoice瀵硅薄锛?>>c#鏌ョ湅c鍏冪礌鐨勫睘鎬?>>c.question#鏌ョ湅q瀵硅薄锛屽閿搴旂殑瀵硅薄>>>q.choice_set.all(),,]>>>>q.choice_set.count()3>>>Choice.objects.filter(question__pub_date__year=current_year),,]>>>>c=q.choice_set.filter(choice_text__startswith="Justhacking")#deletec瀵硅薄>>>c.delete()(1,{'polls.Choice':1})>>>q.choice_set.all(),]>浜斻€丏jaong绠$悊鐣岄潰绠$悊鐣岄潰涓嶆槸缁欑綉绔欒瀹㈢湅鐨勶紝鏄粰绠$悊鑰呯湅鐨勫噯澶囸煂?.1鍒涘缓绠$悊鍛樿处鎴峰湪鍛戒护琛岃繍琛屼互涓嬪懡浠わ細pythonmanage.pycreatesuperuser涔嬪悗浼氭彁绀鸿緭鍏ョ敤鎴峰悕銆侀偖绠便€佸瘑鐮侊紝骞剁‘璁ゅ瘑鐮併€?pythonmanage.pycreatesuperuser鐢ㄦ埛鍚嶏紙鐣欑┖浠ヤ娇鐢ㄢ€滅鐞嗗憳鈥濓級锛氱鐞嗗憳鐢靛瓙閭欢鍦板潃锛歛dmin@example.com瀵嗙爜锛?****瀵嗙爜锛堝啀娆★級锛?*****瀵嗙爜闀垮害澶煭銆傚瘑鐮佸繀椤昏嚦灏戝寘鍚?涓瓧绗︺€傝繖涓瘑鐮佸お甯歌浜嗐€傚瘑鐮佷粎鍖呭惈鏁板瓧銆傜粫杩囧瘑鐮侀獙璇佸苟鍒涘缓鐢ㄦ埛锛焄y/N]:ySuperuser鍒涘缓鎴愬姛銆傪煂?.2鐧诲綍绠$悊鐣岄潰鍚姩寮€鍙戞湇鍔″櫒锛歱ythonmanage.pyrunserver鎵撳紑娴忚鍣細http://127.0.0.1:8000/admin/杈撳叆璐﹀彿鍜岃繘鍏ョ鐞嗙晫闈㈢殑瀵嗙爜銆傪煂?.3鍦ㄧ鐞嗛〉闈㈡坊鍔犳姇绁ㄥ簲鐢?polls/admin.pyfromdjango.contribimportadminfrom.modelsimportQuestionadmin.site.register(Question)馃寠5.4浣撻獙渚挎嵎鐨勭鐞嗗姛鑳界偣鍑婚〉闈㈡寜閽娇鐢ㄦ坊鍔犮€佸垹闄ゃ€佷慨鏀瑰拰鏌ヨ鍔熻兘銆?.銆怭yCharm浣跨敤鎶€宸с€戰煉?.1浣跨敤PyCharm宸ュ叿杩愯makemigrations&migrate6.2浣跨敤PyCharm杩愯djangoshell鍦≒yCharm搴曢儴鐨勫伐鍏锋爮涓紝閫夋嫨PythonConsole锛岃繘鍏ythonmanage.pyshell銆傚厛鍐虫潯浠讹細椤圭洰浠jango鏀寔寮€濮嬨€傞」鐩惎鍔ㄨDjango鏀寔锛氥€愰倐閫匘jango銆?锛堜竴锛夊垱寤洪」鐩?SegmentFault鎬濊€?.銆怭yCharm浣跨敤鎶€宸с€戠浉姣旈€氳繃pythonmanage.pyshell浠嶵erminal杩涘叆Djangoshell锛屼細鏈変竴瀹氱殑鎻愮ず杈撳叆銆?.DjangoAdmin鏈€绠€鍗曠殑缇庡寲鏂规硶馃拵7.1simpleui绠€浠婦jangoAdmin榛樿鐨勭晫闈㈣璁¤瑷€鏈変竴浜涗笉瓒筹紝姣斿棰滆壊鍗曚竴锛屼娇鐢ㄥぇ閲忕嚎鏉★紝鍒嗗壊鏄庢樉銆傚皢杩欎簺涓嶈冻褰掔被涓虹晫闈㈠崟璋冦€侀浄鍚屾槑鏄俱€佺己涔忔儕鍠溿€俿impleui锛氬熀浜巚ue+element-ui鐨刣jangoadmin鐜颁唬涓婚銆俫ithub鍦板潃锛歨ttps://github.com/newpanjing/simpleui馃拵7.2Simpleui鐨勪娇鐢ㄢ湪7.2.1瀹夎poetryadd-Ddjango-simpleui鉁?.2.2寮€濮嬩娇鐢ㄥ畨瑁呭畬鎴愬悗锛屽湪settings.py鏂囦欢涓璉NSTALLED_APPS浣犺嚜宸辩殑椤圭洰绗竴琛屽姞鍏impleui銆?settings.pyINSTALLED_APPS=['simpleui','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls']濡傛灉涔嬪墠鐨勬湇鍔¤繕鍦ㄨ繍琛岋紝鍒锋柊椤甸潰鍗冲彲銆傚皬缁撴湰鏂囩畝鍗曚粙缁嶄簡Django涓庢暟鎹簱鐨勮繛鎺ュ拰浣跨敤锛屼互鍙婇粯璁ゅ悗鍙扮鐞嗙晫闈㈢殑浣跨敤銆傚苟浣跨敤PyCharm蹇€熻繍琛宮akemigrations&migrate鍛戒护鍜宒jangoshell锛屼娇鐢╠jango-simpleui缇庡寲榛樿鍚庡彴绠$悊鐣岄潰銆?/p>