从基于函数的视图更新对象值

时间:2017-10-17 15:23:11

标签: django postgresql

我有一个django项目,在我的一个模板中有一个带有两个按钮的表单。这些按钮接受或拒绝“优惠”,这是我的模特之一。我将模板的POST请求传递给我有两个函数的视图。如何使这些批准和拒绝按钮更新模型中的“approved_by_x”值?

模板:

<form method="post" class="login-container" action="{% url 'accept_booking' %}">
                        {% csrf_token %}
                       <input class="btn btn-primary" type="submit" value="Accept" name="Accept"/>
                        <input type="hidden" name="offer" value="{{ offer }}" />
                    </form>

                    <form method="post" class="login-container" action="{% url 'decline_booking' %}">
                        {% csrf_token %}
                       <input class="btn btn-primary" type="submit" value="Decline" name="Decline" />
                        <input type="hidden" name="offer" value="{{ offer }}" />
                    </form>

观点:

def accept_booking(pr):
    offer = pr.POST.get("offer")
    print(offer)

def decline_booking(pr):
    offer = pr.POST.get("offer")
    print(offer

模特:

class BookingOffer(models.Model):
    artist = models.ForeignKey(Artist, null=True, related_name='artist')
    artist_manager = models.ForeignKey(User, default=1, limit_choices_to=
    {'groups__name': 'artist_manager'})
    comment = models.TextField(max_length=120, blank=True)
    time_slot = models.ForeignKey('TimeSlot', null=True, blank=True)
    price = models.IntegerField(null=True, blank=True)
    tech_needs = models.TextField(blank=True)
    approved_by_bm = models.BooleanField(default=False)
    accepted_by_am = models.BooleanField(default=False)

1 个答案:

答案 0 :(得分:1)

假设模板中的{{ offer }}包含BookingOffer ID:

from django.shortcuts import get_object_or_404, redirect
from django.http import HttpResponseNotFound

def accept_booking(request):
  if request.method == 'POST':
    offer_id = request.POST.get('offer', None)
    offer = get_object_or_404(BookingOffer, pk=offer_id)
    offer.approved_by_bm = True
    offer.save()
    return redirect('some-url')

  return HttpResponseNotFound('<h1>Page not found</h1>')

或使用基于类的视图:

    from django.shortcuts import get_object_or_404, redirect
    from django.views.generic import View

    class AcceptBookingView(View):

        def post(request):
            offer_id = request.POST.get('offer', None)
            offer = get_object_or_404(BookingOffer, pk=offer_id)
            offer.approved_by_bm = True
            offer.save()
            return redirect('some-url')