Django:尝试点击链接并删除已分配的客户

时间:2018-01-03 16:36:33

标签: python django

早上好。我试图从指定的床上移除客户端时遇到问题。我创建了一个名为" RoomUpdate"的单项表单。这将允许用户通过ModelChoiceField的下拉列表将客户端添加到空的床。

当床已满时,它不允许访问下拉菜单,相反,我有一个链接指示"删除客户端。"我想要发生的是当我点击该按钮时,它会将默认值None分配给该房间的那张床。

对于Django来说,至少对我的新手来说,最棘手的是,我是如何通过多个表格来实现这一点的。在寻找了多个答案并尝试了不同的事情之后,我知道我已经忘记了我所做的事情,所以我绝对可以使用一些帮助。

models.py

class Room(models.Model):
    room_id = models.AutoField(primary_key=True)
    room_number = models.CharField(max_length=5)
    shelter_id = models.ForeignKey(Shelter)
    max_occupancy = models.CharField(max_length=3)
    floor_location = models.CharField(max_length=3)

    def __str__(self):
        return self.room_number


class Bed(models.Model):
    bed_id = models.AutoField(primary_key=True)
    room_id = models.ForeignKey(Room, related_name='beds')
    bed_size = models.ForeignKey(BedSize)
    client_assigned = models.ForeignKey(Clients, null=True, blank=True,     default=None) 

forms.py

class RoomUpdate(forms.ModelForm):
    client_assigned = forms.ModelChoiceField(queryset=Clients.objects.all(), required=False)

#def __init__(self, *args, **kwargs):
    #super(RoomUpdate, self).__init__(*args, **kwargs)
    #self.fields['client_assigned'].choices.insert(0, ('','---------' ) )

class Meta:
     model = Room
     fields = ( 'client_assigned', )

views.py

def room_update(request, pk, template_name='shelter/room_edit.html'):
    rooms = get_object_or_404(Room, pk=pk)
    form = RoomUpdate(request.POST or None, instance=rooms)
    beds = Bed.objects.filter(room_id=pk)
    if form.is_valid():
        form.save()
            return redirect('/shelter/')
    return render(request, template_name, {'form': form, 'rooms': rooms, 'beds':beds,})


def remove_client(request, pk):
    rooms = get_object_or_404(Room, pk=pk)
    bed = Bed.objects.filter(room_id=pk)
    form = RoomUpdate(request.POST)
    template_fail = 'clients/invalid_permissions.html'
    if request.method=='POST':
        if form.is_valid():
            bed.objects.update(client_assigned=None)
            bed.save()
    else:
        return redirect(request, template_fail)
    return render_to_response(request, {'rooms': rooms, 'bed': bed})

模板

<form action="" method="POST">
    {% csrf_token %}
    <div class="room box-shadow">
        <h4>Room {{ rooms.room_number }}</h4>
        <table>
            {% for i in rooms.beds.all %}
            <tr>
                <td>Bed ID: </td>
                <td>{{i.bed_id }}</td>
            </tr>
            <tr>
                <td>Bed Size: </td>
                <td>{{i.bed_size }}</td>
            </tr>
            <tr>
                <td valign="top">Client: </td>
                <td>
                    {% if i.client_assigned %} 
                        {{ i.client_assigned }} 
                        <br \>
                        <a href="{% url 'shelter:removeclient' i.bed_id %}">Remove Client</a> 
                    {% else %} 
                       {{ form.client_assigned }} 
                    {% endif %}
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <hr class="style-two" />
                </td>
            </tr>
            {% endfor %}
            <tr>
                <td><input type="submit" value="Submit" /></td>
                <td></td>
            </tr>
        </table>
    </div>
</form>

2 个答案:

答案 0 :(得分:0)

我一直在玩这个并取得一些进展。如果我更改了与编辑相同的网址,我会让它工作,因为它会从表中删除并将用户重定向到新页面。

我希望不会将用户重定向到新页面,而是更新那里的页面。

思想?

新视图如下所示:

def remove_client(request, pk, template_name='shelter/test.html'):
    bed = Bed.objects.filter(bed_id=pk).update(client_assigned=None)
    return render(request, template_name, { 'bed':bed })

答案 1 :(得分:0)

进一步深入研究,我找到了一个我喜欢的解决方案,实际上是以我想要的方式工作,但无法弄清楚。我没有专注于房间,而是意识到我需要专注于较小的容器 - 床 - 因为它可以四处移动,所以它将是更好的选择。

目前,此功能允许我将床移到不同的房间,通过选择&#39; ----&#39;去除客户。选择器,并允许我添加客户端。

所以这就是我想出的答案:

forms.py

class RoomUpdate(forms.ModelForm):
    bed_id = forms.CharField()
    room_id = forms.ModelChoiceField(queryset=Room.objects.all())
    bed_size = forms.ModelChoiceField(queryset=BedSize.objects.all(), required=False)
    client_assigned = forms.ModelChoiceField(queryset=Clients.objects.all(), required=False)

    class Meta:
         model = Bed
         fields = ('bed_id', 'client_assigned', 'room_id', 'bed_size' )

views.py

def room_update(request, pk, template_name='shelter/room_edit.html'):
    beds = get_object_or_404(Bed,pk=pk)
    form = RoomUpdate(request.POST or None, instance=beds)
    if form.is_valid():
        form.save()
        return redirect('/shelter/')
    return render(request, template_name, {'form': form, 'beds':beds,})

room_edit.html

<form action="" method="POST">{% csrf_token %}
 <div class="room box-shadow">
    <h4>Room </h4>

    <table>

    <tr>
        <td>Room: </td>
        <td>{{ form.room_id }}</td>
    </tr>

    <tr>
        <td>Bed ID: </td>
        <td>{{ form.bed_id }}</td>
    </tr>
    <tr>
        <td>Bed Size: </td>
        <td>{{ form.bed_size }}</td>
    </tr>
    <tr>
        <td valign="top">Client: </td>
        <td>{{ form.client_assigned }}</td>
    </tr>

    <tr>
        <td colspan="2"><hr class="style-two" /></td>
    </tr>

    <tr>
        <td><input type="submit" value="Submit" /></td>
        <td></td>
    </tr>

    </table>
</div>


</form>