【问题标题】:Django -- Removing an option from queryset form field if already selectedDjango - 如果已选择,则从查询集表单字段中删除一个选项
【发布时间】:2015-05-27 14:21:33
【问题描述】:

我有一个调用查询集并使用“选择”小部件的表单字段。

如果选项值已经“添加”到购物车,有没有办法从查询集中删除它?

在选择表单中,有三个选项:选项A、选项B、选项C。

用户选择选项 A,然后单击“添加”。现在,一旦用户单击“添加”,我想从选择中删除选项 A。

只有选项 B 和选项 C 可供选择。

这可以仅使用 Django+Python 完成吗?还是我需要使用额外的 JS/jQuery?

谢谢!

models.py

class Pickup(models.Model):
    # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, null=True)
    total = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)
    active = models.BooleanField(default=True)
    status = models.CharField(max_length=120, choices=STATUS_CHOICES, default="Open")

    def __str__(self):
        return "Pickup Order ID: %s" %(str(self.id))

class PickupItem(models.Model):
    pickup = models.ForeignKey('Pickup', null=True, blank=True)
    dropoffitem = models.ForeignKey(DropoffItem) 
    notes = models.TextField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

forms.py

class AddPickupItemForm(forms.ModelForm):
    dropoffitem = forms.ModelChoiceField(queryset=DropoffItem.objects.all(), widget=forms.Select(attrs={'class':'form-control'}))


    class Meta:
        model = PickupItem
        fields = ['dropoffitem']

views.py

def add_item_to_pickup_order(request):
    request.session.set_expiry(120000)

    try:
        user = request.user
        the_id = request.session['pickup_id']               
        pickup = Pickup.objects.get(id=the_id)          
    except:
        user = request.user                                 
        new_pickup_order = Pickup(user=user)                
        new_pickup_order.save()
        request.session['pickup_id'] = new_pickup_order.id          

        the_id = new_pickup_order.id
        pickup = Pickup.objects.get(id=the_id)                  

    try:
        dropoffitem = DropoffItem.objects.get(id=id)

    except DropoffItem.DoesNotExist:
        pass
    except:
        pass

    form = AddPickupItemForm(request.POST or None)
    if request.method == "POST":

        dropoffitem_id = int(request.POST['dropoffitem'])
        pickup_item = PickupItem.objects.create(pickup=pickup, dropoffitem_id=dropoffitem_id)

        pickup_item.save()


        return HttpResponseRedirect('%s'%(reverse('add_item_to_pickup_order')))

    context = {

        "pickup": pickup,
        "form": form,

    }
    return render(request, 'pickups/create_pickup_order.html', context)

.html

{% extends "base.html" %}

{% block content %}
<div class="row">
    <div class="container">
        <div class="col-xs-12">
            <h1>Create Cart</h1>

            <form method="POST" action="{% url 'add_item_to_pickup_order' %}">
                {% csrf_token %}
                <table class="table">
                    <thead>
                        <th>Item</th>
                        <th></th>
                    </thead>
                    <tr>
                        <td>{{ form.dropoffitem }}</td>
                        <td><input type="submit" value="Add Item" class="btn btn-default btn-primary" /></td>
                    </tr>
                </table>
            </form>

【问题讨论】:

标签: django django-forms


【解决方案1】:

要从查询集中排除/删除项目,您可以使用exclude

YourModel.objects.exclude(id=4)

排除多个项目:

YourModel.objects.exclude(id__in=[4, 6, 10])

关于exclude on Django docs的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2011-07-13
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多