[英]how to implement ModelChoiceField in Django
我正在嘗試從數據庫模型字段創建輸入選擇,並且我嘗試使用 ModelChoiceField,但我不斷收到錯誤,我不知道如何解決。 我需要幫助。
這是模型
class WeeklySavingsDeposit(models.Model):
WEEKLY_SAVE_DEPOSIT_STATUS_PENDING = 'Pending'
WEEKLY_SAVE_DEPOSIT_STATUS_APPROVED = 'Approved'
WEEKLY_SAVE_DEPOSIT_STATUS_DENIED = 'Denied'
WEEKLY_SAVE_DEPOSIT_STATUS_CHOICES = ((WEEKLY_SAVE_DEPOSIT_STATUS_PENDING, 'Pending'), (WEEKLY_SAVE_DEPOSIT_STATUS_APPROVED, 'Approved'), (WEEKLY_SAVE_DEPOSIT_STATUS_DENIED, 'Denied'))
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateTimeField(default=timezone.now)
savings_title = models.CharField(max_length=100, null = True, blank=True)
amount = models.FloatField()
dep_proof = models.ImageField(upload_to='deposit_proofs')
status = models.CharField(max_length = 40, choices = WEEKLY_SAVE_DEPOSIT_STATUS_CHOICES, default='Pending')
dep_tag = models.IntegerField(default=0)
def __str__(self):
return f'{self.user.username} WeeklySaveDeposit'
class WeeklySaving(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
created = models.DateTimeField(default=timezone.now)
title = models.CharField(max_length = 100, default = 'Weekly Savings Title')
duration = models.CharField(max_length=40, choices=WEEKLY_SAVE_DURATION_CHOICES, default ='2 Months')
completion_date = models.DateTimeField(null=True)
amount = models.FloatField()
target_amount = models.FloatField(null=True)
status = models.CharField(max_length= 40,choices = WEEKLY_SAVE_STATUS_CHOICES, default='Pending')
week_save_day = models.CharField(max_length =100, choices=WEEKLY_SAVE_DAY_CHOICES, default='Friday')
amount_saved = models.FloatField()
我的表格。
class StartWeeklySaveForm(forms.ModelForm):
title = forms.CharField(label = 'Savings Title', required=True)
amount = forms.FloatField(label='Amount to Save Weekly? (in Naira):', min_value=WeeklySaving.MIN_WEEKLY_SAVE, max_value=WeeklySaving.MAX_WEEKLY_SAVE, required=True, widget=forms.TextInput(attrs={'placeholder': 'Input the amount you want to save weekly. Minimum 500'}))
class Meta:
model = WeeklySaving
fields = ["title", "amount", "duration", "week_save_day"]
class DepositWeeklySaveForm(forms.ModelForm):
amount = forms.FloatField(label='Enter Amount in (Naira)', min_value=WeeklySaving.MIN_WEEKLY_SAVE, max_value=WeeklySaving.MAX_WEEKLY_SAVE, required=True, help_text='How much to deposit? Minimum 500',)
dep_proof = forms.ImageField(label='Upload a Proof of Payment', help_text='teller or transaction receipt as image')
class Meta:
model = WeeklySavingsDeposit
fields =["savings_title", "amount", "dep_proof"]
在我的 Views.py 我有這個
@login_required
def weekly_save(request):
startwksave_form = StartWeeklySaveForm(request.POST or None, request.FILES)
depwksave_form = DepositWeeklySaveForm(request.POST or None, request.FILES)
user=request.user
depwksave_form.fields['savings_title'] = WeeklySaveDepositModelChoiceField(WeeklySaving.objects.filter(user=user), empty_label="(Select savings)",required=True)
depwksave_form.fields['amount'] = WeeklySaveDepositAmountModelChoiceField(WeeklySaving.objects.filter(user=user), empty_label="(Select savings amount)",required=True)
我有一個 fields.py 如下
from savings.models import WeeklySaving, WeeklySavingsDeposit
from django.forms import ModelChoiceField
class WeeklySaveDepositModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
result = obj.title
return str(result)
class WeeklySaveDepositAmountModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
result = obj.amount
return float(result)
在我的模板中,表單顯示如下..表單模板視圖
我可以從 WeeklySaving 對象中選擇儲蓄標題和金額,這是我想要的,但是當我提交表單時,它顯示錯誤“用戶名儲蓄”必須是浮點數。 這意味着它實際上是將輸入保存為“用戶名保存”而不是選擇的保存標題和金額。
我該如何解決這個問題,我需要幫助。 我還是新手,使用 django。
謝謝你的幫助。
一般來說,在同一個視圖中使用多個表單總是很困難。 因此,如果您將它們拆分為 2 個視圖,則會容易得多。 也許可以從另一個對象創建一個對象? 更糟糕的是(我認為)兩種形式都有“金額”字段。 也許可以重命名其中之一。
另一個大問題是: DepositWeeklySaveForm().amount = forms.FloatField
和這個depwksave_form.fields['amount'] = WeeklySaveDepositAmountModelChoiceField
這行不通。 WeeklySaveDepositAmountModelChoiceField
應引用 ForeginKey,而不是 FloatField。 所以添加到你的模型中:
class WeeklySavingsDeposit(models.Model):
weekly_savings = models.ForeignKey(WeeklySaving, on_delete=models.CASCADE)
...
我建議將所有內容更改為基於類的視圖,例如CreateView
並使用get_form_kwargs
傳遞用戶。 就像是
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
然后你可以像這樣在 forms.py 中設置字段:
class DepositWeeklySaveForm(forms.ModelForm):
weekly_savings = forms.ModelMultipleChoiceField(queryset=None)
required=True, help_text='How much to deposit? Minimum 500',)
dep_proof = forms.ImageField(label='Upload a Proof of Payment', help_text='teller or transaction receipt as image')
class Meta:
model = WeeklySavingsDeposit
fields =["savings_title", "amount", "dep_proof", "weekly_savings"]
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['weekly_savings'].queryset = WeeklySaving.objects.filter(user=user)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.