在通用CreateView

时间:2017-04-16 10:17:27

标签: python django templates

我有一个模特

class MyModel(models.Model):
    slug = models.UUIDField(default=uuid4, blank=True, editable=False)
    advertiser = models.ForeignKey(Advertiser)
    position = models.SmallIntegerField(choices=POSITION_CHOICES)
    share_type = models.CharField(max_length=80)
    country = CountryField(countries=MyCountries, default='DE')        
    # some other Fields. Edited in a ModelForm

此视图由包含位置,share_type,country作为参数的url调用。我想在模板中显示这些参数。做这个的最好方式是什么。我已经有了这些可能性

1)使用get_context_date并将其存储在上下文

   def get_context_data(self, **kwargs):

       ctx = super(MyModel, self).get_context_data(**kwargs)

       ctx['share_type'] = self.kwargs.get('share_type', None)
       ctx['country'] = self.kwargs.get('country', None)
       ctx['postal_code'] = self.kwargs.get('postal_code', None)
       ctx['position'] = int(self.kwargs.get('position', None))

       return ctx

然后可以在模板中使用

2)使用视图变体

    def share_type(self):
        ret = self.kwargs.get('share_type', None)
        return ret

    def country(self):
        ret = self.kwargs.get('country', None)
        return ret

喜欢

<div class="row">
        <strong>
            <div class="col-sm-3">
                Type : {{ view.share_type }}

             <div class="col-sm-3">
                Country : {{ view.country }}

我认为两种方式都有些多余。有没有人知道更通用的方法。

亲切的问候

迈克尔

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是这样做:

def dispatch(self, request, *args, **kwargs):

    self.share_type = self.kwargs.get('share_type', None)
    self.country = self.kwargs.get('country', None)
    self.postal_code = self.kwargs.get('postal_code', None)
    self.position = int(self.kwargs.get('position', None))
    self.position_verbose = verbose_position(self.position)

    ret = super(CreateAdvertisment, self).dispatch(request, *args, **kwargs)

    return ret

您可以在form_valid方法中使用then

def form_valid(self, form):

    form.instance.advertiser = self.advertiser
    form.instance.share_type = self.share_type
    form.instance.country = self.country
    form.instance.postal_code = self.postal_code
    form.instance.position = self.position

    ret = super(CreateAdvertisment, self).form_valid(form)
    return ret

当然在模板中

            <strong>
            <div class="col-sm-3">
                Typ : {{ view.share_type }}
            </div>
            <div class="col-sm-3">
                PLZ : {{ view.postal_code }}
            </div>
            <div class="col-sm-3">
                Ort : TODO
            </div>
            <div class="col-sm-3">
                Pos : {{ view.position_verbose }}
            </div>

非常感谢这些建议。

此致

迈克尔