如何使用get_context_data实现Django模板

时间:2017-10-18 08:11:57

标签: django django-class-based-views

我需要您的帮助,以便了解如何从get_context_data实现我的class IdentitySocieteResumeView(LoginRequiredMixin,TemplateView) : template_name = 'Identity_Societe_Resume.html' model = Societe def get_context_data(self, **kwargs) : context_data = super(IdentitySocieteResumeView, self).get_context_data(**kwargs) id = self.kwargs['id'] societe = get_object_or_404(Societe, pk=id) obj = Societe.objects.filter(Nom=societe.Nom, SIRET=societe.SIRET, SIREN=societe.SIREN, Ville=societe.Ville) if obj: sc_obj = obj[0] NIU = lib.Individu_Recherche.NIUGeneratorSociete(ModelBase=societe) societe.NumeroIdentification = NIU societe.save() context_data['queryset'] = obj return context_data

我认为我有这门课程:

lib.Individu_Recherche

def NIUGeneratorSociete(ModelBase) : create_year_temp = str(ModelBase.Creation.year) create_year_temp2 = str(create_year_temp.split(" ")) create_year = create_year_temp2[4] + create_year_temp2[5] ''' A process which let to generate NumeroIdentification ''' NumeroIdentification = force_text('%s-%s%s-%s-%s-%s' % ('E', create_year, create_month, create_city, key, create_country_id)) return NumeroIdentification 中的这个重要功能:

{% block content %}

    <div class="title_subtitle_space"></div>

    <div class="resume">

    {% for societe in queryset %}

        Votre société porte le numéro : <b> {{ societe.id}} </b> <p></p>
        N° identification attribué : <b>{{societe.NumeroIdentification}}</b> <br></br>

    {% endfor %}
{% endblock %}

我的模板的一部分:

NumeroIdentification = None

我确定我的模板在执行此功能之前已加载,我进入模板NumeroIdentification,但在我的数据库中,此字段已填满。

我的问题是:如何在我的模板中显示具有良好价值的变量None(我的数据库中存储的值)而不是Cmd + R

如果我按NumeroIdentification(MacOS Actualize),None将不是NIUGeneratorSociete,而是另一个值。我想第一次在我的模板中获得这个值。

使用FBV非常容易,但是对于CBV,我没有克服这个问题

编辑:

我添加了我的函数def NIUGeneratorSociete(ModelBase) : create_year_temp = str(ModelBase.Creation.year) create_year_temp2 = str(create_year_temp.split(" ")) create_year = create_year_temp2[4] + create_year_temp2[5] create_month_temp = ModelBase.Creation.month if len(str(create_month_temp)) == 1 : create_month = '0' + str(create_month_temp) else : create_month = create_month_temp create_city = Villes[ModelBase.Ville] key_temp = randint(0,999999) if len(str(key_temp)) == 1 : key = '00000' + str(key_temp) elif len(str(key_temp)) == 2 : key = '0000' + str(key_temp) elif len(str(key_temp)) == 3 : key = '000' + str(key_temp) elif len(str(key_temp)) == 4 : key = '00' + str(key_temp) elif len(str(key_temp)) == 5 : key = '0' + str(key_temp) else : key = key_temp create_country = ModelBase.Pays create_country_id = None if create_country == "CG" : create_country_id = 1 else : create_country_id = 2 NumeroIdentification = force_text('%s-%s%s-%s-%s-%s' % ('E', create_year, create_month, create_city, key, create_country_id)) return NumeroIdentification

{{1}}

2 个答案:

答案 0 :(得分:1)

这里发生了很多奇怪的事情。

societe = get_object_or_404(Societe, pk=id)之后,您将拥有一个Societe实例(或404)。然后,您过滤Societe以获取在您已收到的实例上具有相同属性的对象列表,然后获取其中的第一个。为什么不只是obj = get_object_or_404(Societe, pk=id)并跳过其余的?

然后,您混合objsocietesc_obj。您对其中一个的操作将丢失在其他人身上,直到您再次获取它们为止,这可能是为什么这可以用于刷新。可能有助于看到您的Societe模型进行确认。

答案 1 :(得分:1)

不幸的是,这段代码是各种各样的困惑。您以多种不同的方式获取同一个对象,并更新一个副本,但期望其他人反映这一变化。

首先将相关对象设为societe。然后由于某种原因,您使用该对象的所有字段对该模型执行另一个查询,以获取由一个对象组成的查询集。然后你对原始对象进行一些操作并保存,但不要将其传递给上下文;相反,你传递了查询集。

您的代码可以简化为:

def get_context_data(self, **kwargs) :

    context_data = super(IdentitySocieteResumeView, self).get_context_data(**kwargs)

    id = self.kwargs['id']
    societe = get_object_or_404(Societe, pk=id)

    NIU = lib.Individu_Recherche.NIUGeneratorSociete(societe)
    societe.NumeroIdentification = NIU
    societe.save()

    context_data['societe'] = societe

    return context_data

和模板:

{% block content %}
<div class="title_subtitle_space"></div>

    <div class="resume">

        Votre société porte le numéro : <b> {{ societe.id}} </b> <p></p>
        N° identification attribué : <b>{{societe.NumeroIdentification}}</b> <br></br>

    </div>
</div>
{% endblock %}

你的图书馆功能也有一些奇怪的事情发生。一个是您将对象作为参数ModelBase传递;虽然你称它为什么并不重要,但ModelBase是一个类,但你的参数是你的Societe类的一个实例。你应该把事情称之为事物。

我无法纠正这个功能,因为它显然是不完整的;所有create_monthcreate_citykeycreate_country_id都未定义。

最后,您应该考虑是否合适。在页面的正常GET请求中从get_context_data调用更新函数;如果在GET上像这样更新对象,那将是非常令人惊讶的。真的,这应该只在POST上完成。