2016-01-21 3 views
0

Я пытаюсь передать объект через форму, но он не работает для меня. В моделях моя модель Subscription имеет ссылку на модель Customer, и в любое время, когда я хочу создать или обновить подписку, мне нужно включить связанного с ней Customer.Передача объекта через Django Forms

class Subscription(StripeObject): 

    sub_user  = models.ForeignKey(Customer) 
    creation_date = models.DateTimeField(auto_now_add=True) 

На мой взгляд, я получаю все, что нужно, и в моем шаблоне, я пытаюсь передать объект клиента с моей точки зрения, как одна из форм полей ввода.

def profile(request): 
    user = request.user.get_full_name() 
    menu_group = Recipes.objects.filter(today=True).order_by('-price') 
    apartments = Apartment.objects.order_by('apartment') 
    plans = Plan.objects.order_by('amount') 

    try: 
     customer = Customer.objects.get(user=user) 
    except Customer.DoesNotExist: 
     customer = Customer(stripe_id=user, user=user, account_balance=0, currency="usd") 
     customer.save() 
     customer = Customer.objects.get(user=user) 

    try: 
     subscription = Subscription.objects.get(sub_user=customer) 
    except Subscription.DoesNotExist: 
     subscription = None 

    try: 
     charge_id = Subscribe.objects.get(user=user) 
    except Subscribe.DoesNotExist: 
     charge_id = None 

    if request.method == "POST": 
     form = AddSubscription(request.POST) 

     if form.is_valid(): # charges the card 
      if subscription is None: 
       form.save() 
       return HttpResponseRedirect('/subscription/charge/') 

      elif subscription.sub_change(form.cleaned_data['weekly_plan']): 
       form.save() 
       subscription.checked_out = True 
       return HttpResponseRedirect('/profile/') 

      else: 
       form.save() 
       subscription.checked_out = False 
       return HttpResponseRedirect('/subscription/charge/') 
     else: 
      return HttpResponseRedirect('/profile/error/') 

    else: 
     form = AddSubscription() 
    return render_to_response("profile.html", {'customer': customer, 'menu_group_list': menu_group, 'subscription': subscription, 'charge_id': charge_id, 'apartments': apartments, 'plans': plans}, context_instance=RequestContext(request)) 

Шаблон: profile.html

{% with cus=customer %} 
<input type="hidden" id="sub_user" name="sub_user" value="{{cus}}"> 
{% endwith %} 

Форма:

class AddSubscription(forms.ModelForm): 

    sub_user = forms.ModelChoiceField(queryset=Customer.objects.none()) 

    class Meta: 
     model = Subscription 
     fields = ['sub_user'] 

    def __init__(self, *args, **kwargs): 
     super(AddSubscription, self).__init__(*args, **kwargs) 

форма, по-видимому, не действует. Я уже пробовал использовать ModelChoiceField, который не работал, и я могу подтвердить, что объекты Subscription и Customer, с которыми я работаю, существуют. Есть идеи? Кто-нибудь видел эту проблему раньше? Как передать объект ForeignKey Customer через форму?

ответ

1

Вы передаете объект Python шаблону, где Django пытается отобразить его в HTML и передать его обратно в HTTP-сообщении. Однако ни HTML, ни HTTP не знают, что такое объект Customer; все, что вы получили, будет строковым представлением объекта.

Вы можете исправить это, передав вместо этого идентификатор клиента, но есть абсолютно нет точки. Вам не нужно передавать клиента в форму и из нее вообще; вы успешно получите его из запроса, когда вы создаете форму в GET, вы можете сделать то же самое на POST.

+0

Так что позвольте мне убедиться, что я понимаю. Я перестаю передавать объект через HTML, и я удаляю ModelChoiceField из моей формы. Вместо этого я получаю объект клиента в своем представлении, а в POST я устанавливаю form.field ['sub_user'] = клиент. Верный? Что мне нужно делать с GET? – acs254

+0

Благодарим вас за помощь. Я понял это на основе ваших комментариев выше. – acs254

Смежные вопросы