django表单下拉选项显示为“对象”而不是模型的字符串表示__str__

tf7tbtn2  于 2023-01-14  发布在  Go
关注(0)|答案(3)|浏览(115)

在我的django表单中,我使用了一个方法来过滤下拉选项,使其与登录用户相关。实现后,显示的值变为objects,而不是__str__值。我发布了简化的代码和一个快照来显示这一点。我已经按照需要做了所有的事情,但我不明白为什么会发生这种情况:

    • 型号. py**
class Business(models.Model):
    client=models.ForeignKey('Client',on_delete=models.CASCADE, limit_choices_to={'is_active':True},)
    name=models.CharField(max_length=30,blank=False, unique=True,)

    def __str__(self):
        return self.name

class MMRequestAttributes(models.Model):
    client=models.ForeignKey('Client',on_delete=models.CASCADE, limit_choices_to={'is_active':True},)    
    business=models.ForeignKey('Business', on_delete=models.CASCADE,limit_choices_to={'is_active':True},)

class Ticket(MMRequestAttributes):    
    no=models.CharField('Ticket Number',max_length=50,default=uuid.uuid4,null=False, blank=False, editable=False, unique=True)
    subject=models.CharField('Subject',max_length=100,null=False, blank=False)
    description=models.TextField('Description',max_length=500,null=True,blank=True)
    created_at=models.DateTimeField('Created at',auto_now_add=True, editable=False)
    updated_at=models.DateTimeField('Updated at',auto_now=True, editable=False)
    created_by= models.ForeignKey(settings.AUTH_USER_MODEL)

    status=StateField(editable=False) 

    def __str__(self):
        return 'Ticket #' + str(self.pk)
    • 查看次数. py**
def new_ticket(request):
    form=NewTicket(request.user)
    return render(request,'mmrapp/new_ticket.html',{'form':form})
    • 管理员py**
class UserExtend(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=False,null=False,)
    client=models.ForeignKey('Client', on_delete=models.CASCADE,limit_choices_to={'is_active': True},)
    • 表单. py**
from django import forms
from .models import Ticket, Business
from .admin import UserExtend
from django.forms import ModelChoiceField

class NewTicket(forms.ModelForm):

    def __init__(self,user, *args, **kwargs):
        super(NewTicket, self).__init__(*args, **kwargs)

        try:
            client_id = UserExtend.objects.values_list('client_id', flat=True).get(user=user)
            self.fields['business'].queryset=Business.objects.filter(client__id=client_id)

        except UserExtend.DoesNotExist:
            ### there is not userextend corresponding to this user, do what you want 
            pass

    class Meta:
        model=Ticket
        fields = ('subject','business')
    • 新票证. html**
{% extends 'mmrapp/__l_single_column.html' %}
{% load static %}

{% block main_col %}
    <h1>New Ticket</h1>
    <form method="POST" class="new-ticket">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Submit</button>
    </form>
{% endblock main_col %}

8qgya5xd

8qgya5xd1#

最后我发现了这个问题。不知何故django在唐斯中显示对象时无法加载原始模型的字符串表示(__str__)。我不得不在from模型中再次显式定义它们。属性名为label_from_instance。好的方面是这样可以显示与模型中最初定义的不同的对象。
所以猴子的补丁应该是

self.fields['business'].label_from_instance = self.business_label

@staticmethod
def business_label(self):
    return str(self.name)
ev7lccsx

ev7lccsx2#

在Python 2.7中,我们使用defunicode(self):returnself.name在python从2.7升级到3.6之后,所有的对象引用都显示在下拉列表中,所以我添加了defstr(self):返回自身名称

vzgqcmou

vzgqcmou3#

我将此方法添加到所讨论的模型中:

def __str__(self):
    return self.whatever_prop_suits_your_needs

相关问题