【问题标题】:Passing value from one field to other field in django form以django形式将值从一个字段传递到另一个字段
【发布时间】:2018-12-04 09:37:45
【问题描述】:

我有两个 django 模型 ModelA 和 ModelB。

class ModelA(models.Model):
    fieldA1 = models.CharField()
    fieldA2 = models.CharField()
    fieldA3 = models.ManyToManyField('ModelC')

class ModelB(models.Model):
    key = models.CharField()
    value = models.CharField()

还有一个 django 表单:

class MyForm(forms.ModelForm):
    A_fields =[field.name for field in ModelA._meta.get_fields()]
    key= forms.ChoiceField(label='Key',choices = [(str(l),str(l)) for l in A_fields])
    value= forms.MultipleChoiceField(label='Value',choices = 'Need Help here'). 

    'I have used MultipleChoiceField because if key == fieldA3 then there could be multiple choices for this field.'

    class Meta:
        model = ModelB
        fields = ('key', 'value')

因为 'key' 字段的选择是 ModelA 的字段名称。我希望根据选择的键(这将是 ModelA 的某个字段名称),为 MyForm 中的“值”字段显示的选择必须是存储在 ModelA 的特定字段中的所有值。

我知道如何获取存储在 ModelA 特定字段中的值。我必须使用以下命令。

field_values = ModelA.objects.values('Field for which i want values')

这是视图:

def MyPageView(request):
    if request.method == 'POST':
        form1 = MyForm(request.POST)
        if form1.is_valid():
            myform = form1.save(commit=False)
            return HttpResponseRedirect('/new_page')
    else:
        return render(request,'app1/my_page.html',{'form1':form1})

这里是 my_page.html

  <form method= "post">
    {% csrf_token %}
    {{ form1.as_p }}
    <input type="submit" name="Save">
 </form>

我该如何解决这个问题?提前致谢。

【问题讨论】:

  • 您希望在选择 key 字段后填充 value 字段,对吧?
  • 是的@SachinKukreja。
  • @DanielRoseman 你能帮帮我吗?

标签: django django-models django-forms django-views


【解决方案1】:

我认为您需要发送 AJAX 请求来获取字段 value 的选择。

后端

url(r'^value_choices/$', views.ValueChoicesView.as_view(), name='value-choices')

import json
from django.http import HttpResponse
from django.views import View

class ValueChoicesView(View):
    def get(self, request, *args, **kwargs):
        key = request.GET.get('key')
        if key is None:
            return HttpResponse(json.dumps({
                "error": "Field 'key' is required."
            }), content_type='application/json')
        # another validation would be if the key belongs in `ModelA`

        data = []
        key_qs = ModelA.objects.all().values(key)

        for item in key_qs:
            if item[key] not in data:
                data.append(item[key])

        return HttpResponse(json.dumps({"data": data}), content_type="application/json")

前端

// assuming you are using jQuery
$(document).on('change', '#idOfKeyDropdown', function() {
    var chosenKey = $(this).children("option:selected").val();
    var data = {"key": chosenKey};

    $.ajax({
        url: "value_choices",
        type: "GET",
        data: data,
        dataType: "json",
        success: function(response) {
            if (response.data) {
                var valueDropdown = $('#idOfValueDropdown');

                // empty value dropdown and add options
                valueDropdown.empty();

                for (var item of response.data) {
                    valueDropdown.append('<option value=' + item + '>' + item + '</option>');
                }                    
            }
        },
        error: function(err) {
            // handle error here
        }
    });
});

参考
* AJAX Docs
* How to make an AJAX request without jQuery

【讨论】:

  • @SachinKukreja 先生,我猜你在想我正在使用 html
  • 非常感谢@SachinKukreja bhai。终于解决了这个问题。
  • 当我选择密钥时,我会在服务器上看到该值,即 HTTP GET /testPage/value_choices/?key=country 。当我选择国家/地区时,我可以在 test_page.html 中看到国家/地区的选项。这意味着您的解决方案正在按照我想要的方式完美运行。但是现在当我选择国家/地区时,服务器上没有任何事情发生。没有 GET 请求。我想要在 django 模型中保存“键”的值及其对应的值。当我在服务器上看不到这些值时,如何保存这些值。因为最后我会在视图函数中从请求中获取这些值。请你帮我@SachinKukreja。
  • 我认为我需要在服务器上获取的内容是这样的。 HTTP GET /testPage/value_choices/?key=country&country=India(或我选择的任何国家)。
  • 这是一个单独的问题,此解决方案不会涵盖。
猜你喜欢
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
相关资源
最近更新 更多