2009-06-03 3 views
0

나는 필드에 대한 imdb_id 내 DB에 영화 :외부 링크가 필요한 텍스트 입력 용 양식 위젯!

class Movie(models.Model): 
    imdb_id = models.IntegerField('imdb ID', blank=True, null=True, unique=True) 

    def _get_imdb_url(self): 
     return self.imdb_id and 'http://www.imdb.com/title/tt%s/' % str(self.imdb_id).zfill(7) or '' 

    def _set_imdb_url(self, imdb_url): 
     self.imdb_id = int(re.compile(r'[^\d]').sub('', imdb_url)) 

    imdb_url = property(_get_imdb_url, _set_imdb_url) 

그리고 'imdb_id'필드에 대한 텍스트 입력 근처의 관리자 양식에서 imdb.com에 대한 외부 링크를 표시하기위한 특별한 위젯을 만들고 싶습니다. 내 생각에 특별한 마스크 (이 경우 마스크는 'http://www.imdb.com/title/tt%s/')를 사용하여 생성 된 외부 링크가있는 양식 필드의 전역 위젯이 될 수 있습니다. 위젯을 작성하는 방법을 알고 있지만, 내 영화 모델에 정의 된 마스크를이 위젯으로 어떻게 밀어 넣을지 모르겠습니다. 나는 DRY principe를 위반하고 두 곳의 다른 장소에서이 마스크를 정의하고 싶지 않습니다. 또한 앞으로 다른 외부 링크와 동일한 목적을위한 좋은 도구가 될 것입니다.

이 위젯에 대해 어떻게 생각하십니까? 그것을 어떻게 실현할 수 있습니까? 누군가 날 전에 그것을 썼을 수 있습니까?

고마워!

답변

0

그래서, 나는 도움을 기다리고하지 않기로 결정이 widget 썼다 :

from utils.widgets import LinkFieldWidget 
class MovieAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MovieAdminForm, self).__init__(*args, **kwargs) 
     self.fields['imdb_id'].widget = LinkFieldWidget(text='imdb', url=self.instance.imdb_link) 

class MovieAdmin(admin.ModelAdmin): 
    form = MovieAdminForm 

모델 :

class Movie(models.Model): 
    .....  
    imdb_link = 'http://www.imdb.com/title/tt%s/' 
    def _get_imdb_url(self): 
     return self.imdb_id and self.imdb_link % str(self.imdb_id).zfill(7) or '' 
    def _set_imdb_url(self, imdb_url): 
     self.imdb_id = int(re.compile(r'[^\d]').sub('', imdb_url)) 
    imdb_url = property(_get_imdb_url, _set_imdb_url) 
관리자에서 사용

import re 
from django import forms 
class LinkFieldWidget(Widget): 
    ''' 
    A TextField widget with previewing link, generated from field's value with special url mask 
    ''' 
    def __init__(self, text, url='%s', *args, **kwargs): 
     self.url = url 
     self.text = text 
     if not re.search('%', self.url): 
      raise forms.ValidationError, u'Invalid URL mask' 
     super(LinkFieldWidget, self).__init__(*args, **kwargs) 

    def render(self, name, value, attrs=None): 
     output = [] 
     output.append('''<input type="text" name="%s" value="%s" onkeyup="$('a#%s-link').attr('href', '%s'.replace('%s', this.value)).css({'display': (this.value ? 'inline' : 'none')})" />''' % (name, value or '', name, self.url, '%s')) 
     if self.url and self.text: 
      output.append('<span><a href="%s" id="%s-link" target="blank" style="display: %s;">%s</a></span>' % (value and self.url % value or '#', name, value and 'inline' or 'none', self.text)) 

     return mark_safe(u' '.join(output))