在Django/Python中添加一个带有对象值的隐藏字段

Dan*_*iel 2 python django django-forms django-views

我正在尝试创建一个应用程序,用户可以在其中管理"丢失属性"项目的数据库.为此,我有一个显示所有项目的主页面,当项目返回给所有者时,我每行都有一个按钮.

该按钮正在提交一个表单,该表单应包含已单击的元素的ID值,因此我尝试获取类似的内容

<input id="id_id" name="id" type="hidden" value="{{lostitem.id}}">
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将这个价值传递给我的表格!这是我的模板:

{% for lostitem in lostitems %}
    <tr>
        <td>{{lostitem.id}}</td>
        <td>{{lostitem.description}}</td>
        <td>
            <form class="give-back-item-form" method="POST">
                {% csrf_token %}
                {{formGiveBackItem.as_p}}
                <button type="submit" class="button btn btn-xs btn-success buttonItems">
                    <span class="glyphicon glyphicon-share-alt" aria-hidden="true"></span>
                </button>
                <!-- TRYING TO ADD A HIDDEN INPUT WITH THE ID AS VALUE -->
            </form>
        </td>
    </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这是我在forms.py中的表单

class GiveBackItemForm(forms.ModelForm):
    id = forms.CharField(widget=forms.HiddenInput())
    class Meta:
        model = ItemLost
        fields = ('id',)
Run Code Online (Sandbox Code Playgroud)

这里是我试图获取我的$ _POST ['id']并更新我的对象(我无法测试此部分,因为我此刻没有收到任何POST信息):

from .forms import GiveBackItemForm
"""Defining our views"""
def item_list(request):
    formGiveBackItem = GiveBackItemForm()
    """Ordering objects by date of creation"""
    lostitems =   ItemLost.objects.filter(added_date__lte=timezone.now()).order_by('added_date')
    if request.method == "POST":
        """Giving back an item"""
        itemToGive = ItemLost.objects.get(pk=request.POST.get('id'))
        itemToGive.giveBackItem
    """Returning our ordered objects to the view"""
    """Request = everything we receive from the user (in a form for example)"""
    return render(request, 'lostitem/item_list.html', {'lostitems': lostitems, 'formGiveBackItem' : formGiveBackItem})
Run Code Online (Sandbox Code Playgroud)

感谢您对代码的任何帮助或评论!我刚刚开始,很难找到有关我的问题的任何有用的东西

编辑:我设法通过仍然使用Django ModelForm和视图来处理我的表单使其工作这是我的视图中的代码:

def item_list(request):
"""Ordering objects by date of creation"""
lostitems = ItemLost.objects.filter(added_date__lte=timezone.now()).order_by('added_date')
"""To get data from the form"""
give_back_item_form = GiveBackItemForm(request.POST or None)
# check if form is valid
if give_back_item_form.is_valid():
    itemToGive = ItemLost.objects.get(pk=give_back_item_form.cleaned_data['id'])
    itemToGive.returned_date=timezone.now()
    itemToGive.save()
# your rest of the code here
"""Returning our ordered objects to the view"""
"""Request = everything we receive from the user (in a form for example)"""
return render(request, 'lostitem/item_list.html', {'lostitems': lostitems, 'give_back_item_form' : give_back_item_form})
Run Code Online (Sandbox Code Playgroud)

这是我的模板的代码!

    <form class="give-back-item-form" method="POST">
        {% csrf_token %}
        <input type="hidden" name="id" value="{{ lostitem.id }}">
        <button type="submit" class="button btn btn-xs btn-success buttonItems">
            <span class="glyphicon glyphicon-share-alt" aria-hidden="true">    </span>
        </button>
    </form>
Run Code Online (Sandbox Code Playgroud)

谢谢大家的答案,它引导我找到正确的解决方案!

Myk*_*lis 7

如果你想要做的就是回发id关联ItemLost对象,以便你可以在它上面调用一个方法(例如giveBackItem()),根本不需要使用ModelForm.只需使用普通的HTML <form>,并手动将隐藏字段放入其中:

<form class="give-back-item-form" method="POST">
    {% csrf_token %}
    <button type="submit" value="Give Back">                       
    <input type="hidden" name="id" value="{{lostitem.id}}">
</form>
Run Code Online (Sandbox Code Playgroud)

所以你的完整模板将成为:

{% for lostitem in lostitems %}
    <tr>
        <td>{{lostitem.id}}</td>
        <td>{{lostitem.description}}</td>
        <td>
            <form class="give-back-item-form" method="POST">
                {% csrf_token %}
                <button type="submit" class="button btn btn-xs btn-success buttonItems">
                    <span class="glyphicon glyphicon-share-alt" aria-hidden="true"></span>
                </button>
                <input type="hidden" name="id" value="{{lostitem.id}}">
            </form>
        </td>
    </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)