2014-10-07 60 views
1

我需要從外鍵獲取值,這是我計劃使用JavaScript顯示的網址。問題出在創建後:如何在django中顯示來自raw_id_fields的值?

class SplashScreenAdmin(admin.ModelAdmin): 
    list_display = ('title', 'text', 'background', 'button',) 
    search_fields = ('title', 'text') 
    list_filter = ('background', 'button') 
    raw_id_fields = ('picture',) 

admin.site.register(SplashScreen, SplashScreenAdmin) 

我無法從中獲取數據。至少我需要它在raw_id_fields旁邊顯示標題。有沒有簡單的方法來實現這一點?

What I need to do

+0

您是否嘗試過在指定領域的'''help_text'''參數? https://docs.djangoproject.com/en/dev/ref/models/fields/#help-text – schillingt 2014-10-07 01:48:09

+0

我也想從數據模型中獲取標題。所以,如果它是圖片,我可以得到圖片名稱或圖片網址。我不認爲help_text可以檢索對象數據。 – Nameless 2014-10-07 01:50:47

+0

你說得對。這是我的錯誤。你必須考慮自定義一個表單域來做你想要的。 – schillingt 2014-10-07 01:54:16

回答

1

在這裏一個小竅門後,在那裏我終於能夠得到這個工作。

Models.py

class ImageMedia(models.Model): 
    caption = models.CharField(max_length=64) 
    picture = models.ImageField(upload_to='image_media', blank=True) 

class SplashScreen(models.Model): 
    title = models.CharField(max_length=25) 
    text = models.TextField() 
    background = models.ForeignKey(Background) 
    button = models.ForeignKey(Button) 
    url = models.URLField() 
    picture = models.ForeignKey(ImageMedia) 

    def splash_image(self): 
     return '<img id="media_image" src="{0}{1}" height="150px"/><p id="media_caption">Caption</p> '.format(
      settings.MEDIA_URL, '') 

    splash_image.allow_tags = True 

    def __str__(self): 
     return self.title 

views.py

from django.contrib.auth.decorators import login_required 
import json 

@login_required 
def get_picture_media(request): 
    if request.method == 'GET': 
     media_id = request.GET['media_id'] 

     if media_id: 
      media = ImageMedia.objects.get(id=int(media_id)) 
      if media: 
       media_data = {'media_url': media.picture.url, 'media_caption': media.caption} 
       return HttpResponse(json.dumps(media_data)) 

Admin.py

class SplashScreenAdmin(admin.ModelAdmin): 
    list_display = ('title', 'text', 'background', 'button',) 
    search_fields = ('title', 'text') 
    list_filter = ('background', 'button') 
    raw_id_fields = ('picture',) 
    fields = ('title', 'text', 'background', 'button', 'url', 'picture', 'splash_image') 
    readonly_fields = ['splash_image'] 

    class Media: 
     js = ("js/media-render.js",) 

admin.site.register(SplashScreen, SplashScreenAdmin) 

JS /媒體render.js

function media_render() { 
    var id_picture = document.getElementById('id_picture').value; 
        var media_url = ''; 
        var media_caption = ''; 
        $.get(document.location.origin + '/get_picture_media/', {media_id: id_picture}, 
             function(data){ 
              data = JSON.parse(data); 
              media_url = data['media_url']; 
              media_caption = data['media_caption']; 
              document.getElementById('media_image').src = media_url; 
              document.getElementById('media_caption').innerHTML = media_caption;}); 
        }; 
window.onfocus = media_render; 
document.getElementById('id_picture').onchange = media_render; 

這樣,我可以隨時更新我的​​圖像,每當我更改原始ID,我也可以獲得標題。隨着schillingt我分開JS那麼一點點的代碼現在有點整潔

最終結果:

Final result

+0

您可以將JavaScript添加到它自己的JS文件中,並通過管理中的媒體文件選項將其包含在內。 – schillingt 2014-10-08 12:44:21

+0

是不是將它添加到選項會使其在整個管理網站中處於活動狀態?如果沒有這個例子或文檔的鏈接,我可能會嘗試實現它。 – Nameless 2014-10-08 17:10:49

+0

不,它只會用於該模型的創建和更新頁面。 https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#modeladmin-asset-definitions – schillingt 2014-10-08 18:28:23

相關問題