这是这个问题的后续问题: How to pass user object to forms in Django

这是我的表格:

class SellForm(forms.Form):
    symbol = forms.ModelChoiceField(queryset=None, widget=forms.Select(attrs={
        'class': 'form-control',
        'placeholder': 'Symbol',
        'autofocus': 'autofocus',
        }))
    
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        super(SellForm, self).__init__(*args, **kwargs)
        self.fields['symbol'].queryset = Holdings.objects.filter(student=self.request.user.student)

This form is providing me with this dropdown: the example of the dropdown that this form creates

我在模型中有额外的信息,那就是每股的买入价,有没有办法把它也放到表格上?它必须是不可编辑的,尽管这是股票购买时的价格.

下面是表单从中获取数据的模型:

class Holdings(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    symbol = models.CharField(max_length=10)
    purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
    
    class Meta:
        verbose_name_plural = "Holdings"
        ordering = ['symbol']
    
    def __str__(self):
        return self.symbol

如果可能的话,我将非常感谢您的帮助!谢谢!

推荐答案

最简单的方法就是覆盖__str__方法,并包括购买价格:

class Holdings(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    symbol = models.CharField(max_length=10)
    purchase_price = models.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        verbose_name_plural = "Holdings"
        ordering = ['symbol']

    def __str__(self):
        return f'{self.symbol} ({self.purchase_price})'

过滤可以更高效地完成,不过使用以下选项:

class SellForm(forms.Form):
    symbol = forms.ModelChoiceField(
        queryset=None,
        widget=forms.Select(
            attrs={
                'class': 'form-control',
                'placeholder': 'Symbol',
                'autofocus': 'autofocus',
            }
        ),
    )

    def __init__(self, *args, request, **kwargs):
        super(SellForm, self).__init__(*args, **kwargs)
        self.fields['symbol'].queryset = Holdings.objects.filter(
            student__user=self.request.user
        )

因为这将阻止为用户获取Student对象的查询,或者我们可以使用:

class SellForm(forms.Form):
    symbol = forms.ModelChoiceField(
        queryset=None,
        widget=forms.Select(
            attrs={
                'class': 'form-control',
                'placeholder': 'Symbol',
                'autofocus': 'autofocus',
            }
        ),
    )

    def __init__(self, *args, request, **kwargs):
        super(SellForm, self).__init__(*args, **kwargs)
        self.fields['symbol'].queryset = Holdings.objects.filter(
            student_id=self.request.user.student_id
        )

Python相关问答推荐

为什么基于条件的过滤会导致pandas中的空数据框架?

遵循轮廓中对象方向的计算线

通过仅导入pandas来在for循环中进行多情节

具有多个选项的计数_匹配

Django管理面板显示字段最大长度而不是字段名称

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

删除所有列值,但判断是否存在任何二元组

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如果值不存在,列表理解返回列表

管道冻结和管道卸载

当独立的网络调用不应该互相阻塞时,'

使用Python更新字典中的值

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

使用NeuralProphet绘制置信区间时出错

在Django admin中自动完成相关字段筛选

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

OpenCV轮廓.很难找到给定图像的所需轮廓