簡體   English   中英

在 Django Forms 下拉列表中,如何顯示通過外鍵訪問的文本?

[英]In a Django Forms drop-down list, how do I show text accessed via a foreign key?

我有代碼來編輯一個表“儀器”,該表具有另一個表“儀器類型”的外鍵。 我想顯示一個下拉列表,其中顯示了儀器類型表中的文本值。 我的問題是下拉列表顯示“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)

我已經閱讀了很多關於此的文檔和相關答案,但到目前為止還沒有找到解決方案......令人沮喪,因為它看起來很簡單......

覆蓋模型上的__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}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM