在django中,如何使用基于函数的视图中的另一个模型数据

时间:2018-06-01 12:37:55

标签: django python-3.x django-models django-forms

所以我有一个表格用借款人更新key_instance对象。目前我的应用程序需要用户输入借用者的名称,但我希望它显示来自另一个模型的数据的下拉列表user模型可供选择,无论如何在基于类的视图中执行此操作?这是我的views.py和我的模板。我想的是我想在用户模型上使用get_list_or_404并将其显示为模板中的下拉列表,并使用该选择来填充表单域。

我想让下拉列表显示在我的模板中,但我不确定如何在我的视图中保存该值。

有谁知道这是正确的方式还是可行的?谢谢!!

views.py

def submit_key_request(request, pk):

    """
    View function for renewing a specific keyInstance by admin
    """
    key_inst=get_object_or_404(KeyInstance, pk=pk)
    names = get_list_or_404(Users)

    # If this is a POST request then process the Form data
    if request.method == 'POST':

        # Create a form instance and populate it with data from the request (binding):

        form = UpdateKeyForm(request.POST)


        # Check if the form is valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required (here we just write it to the model due_back field)
            key_inst.is_requested = True
            key_inst.status = 'r'
            key_inst.date_requested = datetime.date.today()
            key_inst.borrower = form.cleaned_data['borrower']
            key_inst.save()

            # redirect to a new URL:
            return HttpResponseRedirect(reverse('all-available-keys') )


    # If this is a GET (or any other method) create the default form.
    else:

        form = UpdateKeyForm(initial={'borrower': 'N/A'})

    return render(request, 'catalog/keyinstance_request_update.html', {'form': form, 'keyinst':key_inst})

模板

{% extends "base_generic.html" %}
{% block content %}
<div class="wrapper">

    <div class="centered"> <h1>Request Keys For Room: {{keyinst.roomkey}}</h1></div>



<div class="square-box">
    <div class="square-content">
    <form action="" method="post" >

        {% csrf_token %}
        <table style="display: inline-flex">
        {{ form}}
        </table>
        <select name = 'name'>
        {% for name in names %}
            <option value="{{ name }}">{{ name }}</option>
        {% endfor %}
        </select>
        <p>
            (Please use their login name i.e. <b>{{ user.get_username }}</b>)
        </p>
        <p><input required id="checkBox" type="checkbox" onclick="validate()"> I accept the <a href="{% url 'key-agreement'%}">terms and conditions</a></p>
        <p id="text" style="display:none">You Have Agreed To the Terms and Conditions</p>
        <input type="submit" value="Submit" />
    </form>
    </div>
</div>

</div>

{% endblock %}

1 个答案:

答案 0 :(得分:0)

以下是我如何做到这一点,不确定这是否是最好的&#39; pythonic&#39;或最佳实践。如果不是,请告诉我。

my views.py

def submit_key_request(request, pk):

    """
    View function for renewing a specific keyInstance by admin
    """

    key_inst=get_object_or_404(KeyInstance, pk=pk)
    names = get_list_or_404(User)

    # If this is a POST request then process the Form data
    if request.method == 'POST':
        name = request.POST['name']

        key_inst.is_requested = True
        key_inst.status = 'r'
        key_inst.date_requested = datetime.date.today()
        key_inst.borrower = name
        key_inst.save()

        return HttpResponseRedirect(reverse('all-available-keys') )


    # If this is a GET (or any other method) create the default form.
    else:
        pass


    return render(request, 'catalog/keyinstance_request_update.html', {'keyinst':key_inst, 'names':names})

template

{% extends "base_generic.html" %}
{% block content %}
<div class="wrapper">

    <div class="centered"> <h1>Request Keys For Room: {{keyinst.roomkey}}</h1></div>



<div class="square-box">
    <div class="square-content">
    <form action="" method="post" >

        {% csrf_token %}
        </br>
        <select name = 'name' required>
        {% for key in names %}
            <option value="{{ key }}">{{ key }}</option>
        {% endfor %}
        </select>

        <p>
            (Please use their login name i.e. <b>{{ user.get_username }}</b>)
        </p>
        <p><input required id="checkBox" type="checkbox" onclick="validate()"> I accept the <a href="{% url 'key-agreement'%}">terms and conditions</a></p>
        <p id="text" style="display:none">You Have Agreed To the Terms and Conditions</p>
        <input type="submit" value="Submit" />
    </form>
    </div>
</div>

</div>

{% endblock %}