【问题标题】:Django - Custom values for inline list item fieldDjango - 内联列表项字段的自定义值
【发布时间】:2021-03-31 03:15:57
【问题描述】:

搜索了一段时间后,我似乎找不到任何答案,所以我问这个问题。我想要的是根据一个人的薪水和一个括号显示一些值。我的模型看起来像这样。

class Employee
    salary = models.DecimalField

class Benefit
    some_fields

class EmployeeBenefit
    employee = models.ForeignKey
    benefit = models.ForeignKey

class BenefitVersion
    benefit = models.ForeignKey

class BenefitBracket
    benefit_version = models.ForeignKey
    from_salary = models.DecimalField
    to_salary = models.DecimalField
    the_fields_I_want_to_display

正如您所看到的,它非常深,需要进行大量查询才能找到我想要的字段。

我基本上需要获取员工的薪水(这很容易,因为这将在 EmployeeAdmin 内部)然后获取 EmployeeBenefit 列表项的当前福利,然后根据福利和员工的薪水,获取括号和然后在inline 上显示其中的一些字段。

我想在我的EmployeeAdmin 中为EmployeeBenefitadmin.TabularInline 上显示the_fields_I_want_to_display。我在inline 中使用forms.ModelForm 进行测试,并根据this 答案使用get_form 修改其内容,但django 没有调用get_form。我之前也尝试过使用calculated_fields,但它也没有被渲染。

我正在使用 django 3.1.7 顺便说一句

编辑:

我找到了this 并立即试用。我认为它有潜力,但不幸的是get_formset 给出的objEmployee,所以我仍然需要找到一种方法来为列表项找到正确的EmployeeBenefit

【问题讨论】:

    标签: django


    【解决方案1】:

    经过一番搜索,我已经找到了一种方法。基于this SO 的回答,我了解了如何接收使用get_formset 传递给表单集的数据。

    所以,在我的get_formset 中,我做了这样的事情。

    def get_formset(self, request, obj=None, **kwargs):
        formset = super(Inline, self).get_formset(request, obj, **kwargs)
        formset.request = request
        benefit_details_dict_arr = []
    
        emp_contribs = models.EmployeeBenefit.objects.filter(employee=obj)
        #because what I'm getting here is Employee and not a EmployeeBenefit, I have to query it first
    
        for contrib in emp_contribs:
            bracket = contrib.get_benefit_bracket(datetime.now())
            benefit_details_dict_arr.append({
                "key": bracket.val,
                "key2": bracket.val2,
            })
    
        formset.benefit_details = benefit_details_dict_arr
    
        return formset
    

    然后在表单集上,我以这种方式接收数据。

    class EmpBenefitFormSet(forms.models.BaseInlineFormSet):
        model = models.EmployeeBenefit
    
        def __init__(self, *args, **kwargs):
            super(EmpBenefitFormSet, self).__init__(*args, **kwargs)
            
            cntr = 0
            for form in self.forms:
                init_data = self.benefit_details[cntr]
    
                for field in form.fields:
                    if field in init_data:
                        form.initial[field] = init_data[field]
    
                        form.fields[field].required = False
                        form.fields[field].disabled = True
    
                cntr += 1
    

    另外,如果您要使用这种方式来接收数据,您要膨胀的每个字段都应该在内联的fields 上声明。如果您要设置初始值的字段是模型的实际字段,这应该可以工作。您可能需要稍微调整一下以适用于自定义字段

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2018-02-22
      • 2012-10-19
      • 1970-01-01
      • 2021-01-07
      • 2014-01-12
      • 2017-12-17
      • 2011-07-07
      相关资源
      最近更新 更多