Django Dynamic models를 해결하는 admin질문
4297 단어 Django
전단의 조작을 통해 모델을 만들고 관리 플랫폼을 통해 이를 관리한다. 즉, 이 모델은 코드를 통해 작성된 클래스가 아니라 동적으로 만들어진 것이다.
참고 자료https://code.djangoproject.com/wiki/DynamicModels이 기능을 실현하고 관리 플랫폼에서 이 모델을 찾을 수 있습니다.
def create_model_class(name, cname, fields=None, app_label='', module='', options=None, admin_opts=None):
'''
Create dynamic model
'''
class Meta:
verbose_name = cname
verbose_name_plural = "%s%s"%(cname,u" ")
app_label = "dict"
if app_label:
setattr(Meta,'app_label',app_label)
if options is not None:
for key,value in options.iteritems():
setattr(Meta, key, value)
attrs = {'__module__': name,'Meta':Meta}
for n,t in fields.items():
cn_name = t[0]
t = dict(FIELD_TYPE)[t[1]]
if t == 'VarChar':
f = models.CharField(cn_name, max_length = 255, blank = True)
elif t == 'Int':
f = models.IntegerField()
elif t == 'DATE':
f = models.DateTimeField()
else:
assert False
attrs[n] = f
#default field
attrs['create_time'] = models.DateTimeField(u' ',auto_now=False, auto_now_add=True)
attrs['change_time'] = models.DateTimeField(u' ',auto_now=True, auto_now_add=False)
attrs['last_user'] = models.CharField(u' ', default='',max_length=50,blank=True)
model = type(name, (models.Model,), attrs)
class Admin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.last_user = request.user.username
obj.save()
if admin_opts:
for key, value in admin_opts:
setattr(Admin, key, value)
admin.site.register(model, Admin)
return model
그런데 문제가 생겼어요. 모델을 눌렀을 때 이 모델의 관리 인터페이스에 들어가지 않았어요. 플러스 번호를 눌렀을 때 404로 바로 보고했어요.
검사 html 발견
테스트 관리
증대
수정
현상1 하이퍼링크 주소가 틀린 게 뻔하다
현상 2 Django가 다시 시작되면 이 다이나믹 모델을 불러옵니다. 모든 것이 정상입니다.
해당 템플릿을 찾습니다. C:\Python27\Lib\site-packages\Django-1.7-py2.7.egg\django\contrib\admin\templates\admin\index.html
{% if model.admin_url %}
{{ model.name }}
{% else %}
{{ model.name }}
{% endif %}
{% if model.add_url %}
{% trans 'Add' %}
{% else %}
{% endif %}
{% if model.admin_url %}
{% trans 'Change' %}
{% else %}
{% endif %}
이로써 알 수 있듯이 렌더링할 때 모델.admin_url은 빈 문자입니다.
django 소스 보기,admin 찾기url의 할당값은django/contrib/admin/sites입니다.py 447행 처리, 그러나 여기는 이상을 처리하지 않았습니다.
try:
model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name)
except NoReverseMatch:
pass
reverse 방법은 django\core\urlresolvers에서 나온 것입니다.py
이 단원에서는 다음을 설명합니다.
"""This module converts requested URLs to callback view functions. RegexURLResolver is the main class here. Its resolve() method takes a URL (as a string) and returns a tuple in this format: (view_function, function_args, function_kwargs) """
결합현상2 판단은 캐시와 관련이 있다
urlresolvers.py 모듈은 다음과 같은 방법을 정의했다
def clear_url_caches():
get_callable.cache_clear()
get_resolver.cache_clear()
get_ns_resolver.cache_clear()
소개할 방법이 없고,django 원본 코드에서 테스트 용례만 이 방법을 호출했지만, 캐시를 청소하는 것을 보았습니다
최종적으로 실천을 통해 해결 방법을 찾다.
Dynamic models를 만든 후 추가
clear_url_caches()
reload(import_module(settings.ROOT_URLCONF))
박문은 참고만 제공한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.