2009-06-03 62 views
0

我一直對模型的電影領域imdb_id在我的數據庫:需要外部鏈接的文本輸入的窗體小部件!

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.com「imdb_id」。我認爲它可能是任何帶有外部鏈接的表單域的全局部件,通過使用特殊掩碼生成(在我的情況下,這個掩碼是'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))