【问题标题】:Populate dropdown in template from model choices using Django Rest Framework使用 Django Rest Framework 从模型选择中填充模板中的下拉列表
【发布时间】:2021-03-28 03:13:12
【问题描述】:

我的模型、序列化器、视图集和html如下:

GENDER = (
    ('MALE', 'Male'),
    ('FEMALE', 'Female'),
    ('OTHERS', 'Others'),
)

class Client(BaseModel):
    first_name = models.CharField(max_length=256)
    last_name = models.CharField(max_length=256, default="", blank=True, null=True)
    designation = models.CharField(max_length=256, default="", blank=True, null=True)
    gender = models.CharField(max_length=20, choices=GENDER, null=True, blank=True)


class ClientSerializer(QueryFieldsMixin, DynamicFieldsModelSerializer):
    name = serializers.SerializerMethodField()

    def get_name(self, obj):
        return getattr(obj, "first_name", "") + " " + getattr(obj, "last_name", "")

    class Meta:
        model = Client
        fields = '__all__'


@method_decorator(login_required, name='dispatch')
class ClientViewSet(viewsets.ModelViewSet):
    model = Client
    queryset = model.objects.all()
    serializer_class = ClientSerializer

    @action(detail=True,  methods=['post','get'], renderer_classes=[renderers.TemplateHTMLRenderer])
    def update_client(self, request, *args, **kwargs):
        object = self.get_object()
        context = {"operation": "Update",
                   "object_id": object.id,
                   "events": Event.GetEventsForObject(object)}
        template_name = 'contact-client.html'
        response = Response(context, template_name=template_name)


<form id="client-form" method="" action="" enctype="multipart/form-data" operation="{{operation}}">
    {% csrf_token %}
    <div class="row">
        <div class="columns medium-5 medium-text-left">
          <div class="select2-full select-2-full--sm input-rounded">
            <label for = "gender" style="text-align: left;" >Gender</label>
            <select id="gender" class="js-select2 input-height-sm element-contact" name="gender" validated="false"></select>
            <option></option>
          </div>
          <div id="gender_error" style="display:none">
            <p class="help-text"> <span class="form-action-icon error-icon"></span>Please select gender.</p>
          </div>
        </div>
        <div class="columns medium-5 medium-text-left">
    </div>
    </div>
</form>

当我像 ClientSerializer() 这样在 shell 中实例化 ClientSerializer 时,会显示该性别字段及其选项。但我无法在模板中显示它。所有其他字段都正确传递。

如何使用模板中的选项值填充下拉列表?我应该在option 标签中传递什么来显示选项并将数据发送到视图?

【问题讨论】:

    标签: django django-rest-framework django-templates


    【解决方案1】:

    使用 ChoiceField 代替 CharField

    替换此行

    gender = models.CharField(max_length=20, choices=GENDER, null=True, blank=True)
    

    这个

    gender = models.ChoiceField(max_length=20, choices=GENDER, null=True, blank=True)
    

    要显示模板中的所有选项,您可以执行以下操作

    from my_app.models import gender
    
    context = {"choices" : gender}
    response = Response(context,template_name)
    

    在模板中

    {% for choice in choices %}
        <option value="{{ choice }}">{{ choice }}</option>
    {% endfor %}
    

    【讨论】:

    • 好的。以及如何在模板的下拉列表中显示选项?
    • @user001 我已经更新了我的答案,现在你看看它
    • 好的。知道了。我很困惑,因为在response 对象中没有通过,我认为serializer 将通过choices。我不想从视图中明确指定它。猜猜这是这种情况下的唯一方法。
    • @user001 你能把它标记为正确的答案,或者可以给我一个赞成票。这对我有很大帮助。
    • 当然。如果我在某个时候没有得到更好的答案,那么我会将其标记为正确答案。现在我已经投票了。
    【解决方案2】:

    如果您使用的是 django-template,那么您可以创建一个模型表单并将该表单作为渲染上下文传递,然后在表单中渲染它。

    更多模型表格:https://docs.djangoproject.com/en/3.1/topics/forms/modelforms/

    【讨论】:

    • 我正在使用 html form 标签。不是modelform。如何使用 form 而不是 modelform 显示它?
    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2018-12-11
    相关资源
    最近更新 更多