簡體   English   中英

從Django中的generic.UpdateView訪問表單方法

[英]Access a form method from generic.UpdateView in Django

我有一個視圖,它是一個generic.UpdateView ,並且我需要訪問一種表單方法get_hidden_fields() 如何訪問?

我目前使用self.form_class().get_hidden_fields()但是我不確定這是否正確。 我認為它會創建表單的新實例,並且我想使用當前實例。

def get_context_data(self, **kwargs):
    cd = super().get_context_data(**kwargs)
    cd.update({
        'matches_list': self.page.object_list,
        'form_hidden_fields': list(self.form_class().get_hidden_fields()),
    })
    return cd

https://github.com/speedy-net/speedy-net/blob/staging/speedy/match/matches/views.py#L54

我可以直接從模板訪問form方法:

{% if field.name in form.get_hidden_fields %}

鏈接

但是,如果我需要從Python訪問表單,我認為正確的方法是在get_context_data使用cd['form'] (在調用cd = super().get_context_data(**kwargs) )。

def get_context_data(self, **kwargs):
    cd = super().get_context_data(**kwargs)
    cd.update({
        'matches_list': self.page.object_list,
        'form_hidden_fields': list(cd['form'].get_hidden_fields()),
    })
    return cd

更新1:8月10日

def get_context_data(self, **kwargs):
    if "form" in kwargs:
        form = kwargs['form']
    else:
        form = self.get_form()
        kwargs['form'] = form

    cd = super().get_context_data(**kwargs)
    self.form_class()
    cd.update({
        'matches_list': self.page.object_list,
        'form_hidden_fields': list(form.get_hidden_fields()),
    })
    return cd

這是可以使用的另一種方法,因為當您調用get_context_data ,它將創建不存在的表單。 這意味着您可以創建或讓其創建表單。 如果繼承類的get_context_data執行此操作,則它將以kwargs ,如果沒有hacky方法,則無法提取。

原始方法

因此,您可以在初始化類時使用您擁有的方法,也可以在組合方法中將同一個方法用作類方法和實例方法,然后使用組合方法。 該技術如下文所示

創建同時作為實例和類方法的方法

下面是一個相同的演示

import functools


class combomethod(object):
    def __init__(self, method):
        self.method = method

    def __get__(self, obj=None, objtype=None):
        @functools.wraps(self.method)
        def _wrapper(*args, **kwargs):
            if obj is not None:
                return self.method(obj, *args, **kwargs)
            else:
                return self.method(objtype, *args, **kwargs)

        return _wrapper


class SpeedyMatchSettingsMiniForm(object):
    @combomethod
    def get_fields(self):
        return ('gender_to_match', 'match_description', 'min_age_to_match', 'max_age_to_match', 'diet_match', 'smoking_status_match', 'relationship_status_match')

    @combomethod
    def get_visible_fields(self):
        return ('diet_match', 'min_age_to_match', 'max_age_to_match')

    @combomethod
    def get_hidden_fields(self):
        fields = self.get_fields()
        visible_fields = self.get_visible_fields()
        return (field_name for field_name in fields if (not (field_name in visible_fields)))


print(list(SpeedyMatchSettingsMiniForm().get_hidden_fields()))
print(list(SpeedyMatchSettingsMiniForm.get_hidden_fields()))

輸出是

['gender_to_match', 'match_description', 'smoking_status_match', 'relationship_status_match']
['gender_to_match', 'match_description', 'smoking_status_match', 'relationship_status_match']

因此,在這種情況下,您可以直接使用Class對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM