Как использовать параметры метода в шаблоне Django?

Каким типом интересуются Вы? Тип возврата метода/свойства/события и т.д.?

Если так, я не думаю, что существует что-либо в MemberInfo, чтобы позволить Вам достигнуть его непосредственно - необходимо будет бросить и использовать MethodInfo.ReturnType, PropertyInfo.PropertyType, FieldInfo.FieldType, EventInfo.EventHandlerType и любые другие, которых я забыл. (Помните, что сами типы могут быть участниками. Не уверенный, что Вы захотите сделать с ними!)

РЕДАКТИРОВАНИЕ: Если Вы интересуетесь тем, представляет ли определенный тип или MyType или некоторый подкласс, то используйте Тип. IsAssignableFrom:

if (typeof(MyType).IsAssignableFrom(type))

РЕДАКТИРОВАНИЕ: Теперь, когда мы знаем, что Вы хотите свойства, это легко - используют GetProperties вместо GetMembers. Мне нравится делать отражение с LINQ:

var query = from type in assembly.GetTypes()
            from property in type.GetProperties()
            where typeof(MyType).IsAssignableFrom(property.PropertyType)
            select new { Type=type, Property=property };

foreach (var entry in query)
{
    Console.WriteLine(entry);
}

, Если Вы не поклонник LINQ:

foreach (Type t in a.GetTypes())
    foreach (PropertyInfo pi in t.GetProperties())
        if (typeof(MyType).IsAssignableFrom(pi.PropertyType))
            Console.WriteLine("Found a property that is MyType");

Примечание, что Вы могли бы хотеть указать обязательные флаги для получения непубличных свойств и т.д.

22
задан Community 23 May 2017 в 10:31
поделиться

1 ответ

Команда Django решила из соображений философии не разрешать передачу параметров метода в представление. Лично я с ними согласен; это заставляет разделить логику и представление, которое я считаю полезным. Это предотвращает вид спагетти-кода, которым печально известен PHP.

Правильное решение в случае, когда вы связали, - передать результат этого вызова из представления в шаблон через контекст. Это просто более удобно в обслуживании. Если позже вам потребуется изменить my_related_deltas (3) на my_related_deltas (4) , вы перейдете в представление, которое должно быть достаточно кратким, вместо того чтобы искать по шаблонам, чтобы точно определить, где он определен.

40
ответ дан 29 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: