Django Dynamic models를 해결하는 admin질문

4297 단어 Django
오늘 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))

박문은 참고만 제공한다.

좋은 웹페이지 즐겨찾기