2015-04-02 27 views
0

我正在为多个图像上传写一个自定义小部件。我的模型是:Django自定义小部件,从另一个表填充(类似于内联)

models.py

class Room(models.Model): 
    .... 
    .... 

class Picture (models.Model): 
    room = models.ForeignKey(Room) 
    url=models.ImageField(upload_to='slider', height_field=None, width_field=None, max_length=100) 

    def __unicode__(self): 
     return str(self.url) 

我想创建自定义窗口小部件,允许在房间中显示多个图像上传表单

这是我试过到目前为止:

forms.py

class MultyImageWidget(forms.Widget): 

    .... 

    def render(self, name, value, attrs=None): 
     context = { 
      'images': Picture.objects.filter(room = *room_id_of_currently_edited_room*) 
      # OR 
      # Any another way to get set of images from pictures table 
    } 
    return mark_safe(render_to_string(self.template_name, context)) 


class RoomsForm(forms.ModelForm): 

    gallery = forms.ImageField(widget=MultyImageWidget, required=False) 

    class Meta: 
     model = Room 
     fields = '__all__' 

所以问题是,我没有房间模型中的画廊字段,但我想使用小部件来管理存储在图片表中的图片,类似于如何通过内联管理数据。

如何从我的小部件获取当前正在编辑的房间的ID? 或者有没有其他的方式来获取相关图片?

谢谢

回答

0

我相信你正在对你的问题采用错误的方法。 Widget只负责显示数据,不应关心数据来自何处。您render方法接受一个值参数,它是用来将数据传递给小部件,所以你应该render类似于此:

class MultyImageWidget(forms.Widget): 

    .... 

    def render(self, name, value, attrs=None): 
     context = { 
      'images': value 
     } 
     return mark_safe(render_to_string(self.template_name, context)) 

现在,我们需要通过必要Picture查询集。我们可以通过形式来做到这一点 - 而且形式是什么。您没有提供任何上下文,我也无法评论以了解详细信息,但我想您正在使用视图来构建此表单。如果这是真的,让我们说我们有一定的看法,那么我们就可以这样来做:如果您正在使用这种形式与Django管理

def gallery_view(request, *args, **kwargs): 
    .... 
    room = # get your room (maybe you pass ID via request or via arg or kwarg) 
    pictures = Picture.objects.filter(room=room) # or you can do room.picture_set.all() 
    form = RoomsForm(initial={'gallery': pictures}) 
    .... 

,表单instance属性,你可以像这样的代码:

class RoomsForm(forms.ModelForm): 
    gallery = forms.ImageField(widget=MultyImageWidget, required=False) 

    class Meta: 
     model = Room 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     super(RoomsForm, self).__init__(*args, **kwargs) # you may omit parameters to super in python 3 
     if self.instance: 
      self.fields['gallery'].initial = Picture.objects.filter(room=self.instance) 

我希望这能解决你的问题

+0

嘿Karolis,非常感谢,这正是我需要的。忘记说,我使用django 1.7并以管理员身份使用这个小部件。这很好,欢呼 – Nebojsha 2015-04-03 07:49:39

相关问题