我有代碼來編輯一個表“儀器”,該表具有另一個表“儀器型別”的外鍵。我想顯示一個下拉串列,其中顯示了儀器型別表中的文本值。我的問題是下拉串列顯示“InstrumentType object(n)”而不是另一個表中的儀器型別描述。更新作業正常;當我獲得選定的值并更新儀器表時,會輸入正確的鍵 ID。
這是表格:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from instruments.models import Instrument
from instrumenttypes.models import InstrumentType
# Form used to edit the data pertaining to a specific instrument
class EditInstrumentForm(forms.ModelForm):
instrumenttype = forms.ModelChoiceField(queryset=InstrumentType.objects.all())
class Meta:
model = Instrument
fields = ('instrument', 'dateAdded', 'dateRemoved', 'nickname', 'serialNo', 'status',
'instrumenttype')
這是視圖片段:
def update_instrument_view(request, id=id):
instrument = get_object_or_404(Instrument, id=id)
if request.method == 'POST':
form = EditInstrumentForm(request.POST, request.FILES, instance=instrument)
if form.is_valid():
instrument.instrument = form.cleaned_data.get('instrument')
instrument.dateAdded = form.cleaned_data.get('dateAdded')
instrument.dateRemoved = form.cleaned_data.get('dateRemoved')
instrument.nickname = form.cleaned_data.get('nickname')
instrument.serialNo = form.cleaned_data.get('serialNo')
instrument.status = form.cleaned_data.get('status')
instrument.instrumenttype = form.cleaned_data.get('instrumenttype')
instrument.save()
messages.success(request, 'Your instrument has been updated.')
return redirect('instrument_details', instrument.id)
else:
form = EditInstrumentForm(instance=instrument)
messages.error(request, 'Issue updating data.')
return render(request, 'instrument_update.html', {'form': form, 'instrument':instrument})
else:
form = EditInstrumentForm(instance=instrument)
return render(request, 'instrument_update.html', {'form':form, 'instrument': instrument})
下拉串列顯示物件參考,但我希望它顯示 instrumenttype.instrumentType (這是一個文本描述)。 表單輸出快照
這是儀器型別表的型號:
from django.db import models
from instrumenttypes.models import InstrumentType
from stations.models import Station
# Create your models here.
class Instrument(models.Model):
instrument = models.CharField(max_length=40)
instrumenttype = models.ForeignKey(InstrumentType, on_delete=models.CASCADE, null=True)
station = models.ForeignKey(Station, on_delete=models.CASCADE, default=1)
serialNo = models.CharField(max_length=60, null=True, blank=True)
dateAdded = models.DateTimeField("Date Added", null=True, blank=True)
dateRemoved = models.DateTimeField("Date Removed", null=True, blank=True)
status = models.CharField(max_length=10, null=True, blank=True)
nickname = models.CharField(max_length=40, null=True, blank=True)
這是儀器表的型號:
from django.db import models
from instrumenttypes.models import InstrumentType
from stations.models import Station
# Create your models here.
class Instrument(models.Model):
instrument = models.CharField(max_length=40)
instrumenttype = models.ForeignKey(InstrumentType, on_delete=models.CASCADE, null=True)
station = models.ForeignKey(Station, on_delete=models.CASCADE, default=1)
serialNo = models.CharField(max_length=60, null=True, blank=True)
dateAdded = models.DateTimeField("Date Added", null=True, blank=True)
dateRemoved = models.DateTimeField("Date Removed", null=True, blank=True)
status = models.CharField(max_length=10, null=True, blank=True)
nickname = models.CharField(max_length=40, null=True, blank=True)
我已經閱讀了很多關于此的檔案和相關答案,但到目前為止還沒有找到解決方案......令人沮喪,因為它看起來很簡單......
uj5u.com熱心網友回復:
覆寫__str__模型上的方法以回傳適當的描述,例如;
def __str__(self):
return self.instrumentType
(請注意,您的問題中有兩次 Instrument 模型,而不是您提到的 InstrumentType 模型,因此不能 100% 確定這是訪問正確的欄位,但如果不是,應該很容易讓您作業)
如果您想呼叫自定義方法而不是依賴__str__行為,請參閱https://docs.djangoproject.com/en/4.0/ref/forms/fields/#django.forms.ModelChoiceField.iterator:
from django.forms import ModelChoiceField
class InstrumentTypeModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return f"choice: {obj.instrumentType}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/497729.html
下一篇:一鍵獲取多個表單的值
