2011-05-28 3 views
1

Я пытаюсь дать Джанго попробовать, разработав простую страницу, где люди могут спросить что-то о продуктеPass ток product_id к модели в Django

Это моя модель, я могу создавать продукты в админке , отобразите страницу продукта, и форма появится с полями электронной почты и текстом.

class Product(models.Model): 
    category = models.ForeignKey(Category) 
    title = models.CharField(max_length=100) 
    text = models.TextField() 

class Question(models.Model): 
    email = models.CharField(max_length=100) 
    product = models.ForeignKey(Product, default=?, editable=False) 
    date = models.DateTimeField(auto_now=True, editable=False) 
    text = models.TextField() 

class QuestionForm(ModelForm): 
    class Meta: 
     model = Question 

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

Это мой views.py

# other stuff here 
def detail(request, product_id): 
    p = get_object_or_404(Product, pk=product_id) 
    f = QuestionForm() 
    return render_to_response('products/detail.html', {'title' : p.title, 'productt': p, 'form' : f}, 
    context_instance = RequestContext(request)) 

def question(request, product_id): 
    p = get_object_or_404(Product, pk=product_id) 
    f = QuestionForm(request.POST) 
    new_question = f.save() 

    return HttpResponseRedirect(reverse('products.views.detail', args=(p.id,))) 

И URL

urlpatterns = patterns('products.views', 
    (r'^products/$', 'index'), 
    (r'^products/(?P<product_id>\d+)/$', 'detail'), 
    (r'^products/(?P<product_id>\d+)/question/$', 'question') 
) 

Righ теперь он работает, если я поставить «1» в атрибуте по умолчанию для внешнего ключа продукта в вопросе (где знак вопроса есть), он сохраняет вопрос на идентификатор продукта 1. Но я не знаю, что делать, чтобы сохранить его в текущем продукте.

ответ

3

Вы можете:

Отправить product_id в виде значения

Сделать product foreign key in your form a hidden field и установить это значение первичного ключа продукта в detail зрения. Таким образом вы не необходимо product_id в вашем question вид URL и аргументы, так как ID будет передан с данными POST. (См link примеры)

Id будет использовать эту опцию, так как вы должны были бы чище question URL, и вы могли бы сделать больше проверки в вашей форме на продукте.

или

Отправить product_id через URL

Использование reverse в вашем detail целях создания атрибута формы action или использовать url template tag для создания атрибута action в шаблоне формы. Таким образом, вам нужно product_id в вашем question URL и аргументы, но вам не нужно поле product в вашем QuestionForm. Затем в окне question просто введите экземпляр продукта и установите его как значение FK на Question.


Пример:

Использование url тег шаблона в products/detail.html:

<form action="{% url question product.pk %}" method="post"> 
.... 
</form> 

Или используйте reverse в detail зрения:

def detail(request, product_id): 
    p = get_object_or_404(Product, pk=product_id) 
    f = QuestionForm() 
    return render_to_response('products/detail.html', { 
     'title' : p.title, 
     'product': p, 
     'action': reverse("question", args=[p.pk,]), 
     'form' : f}, 
    context_instance = RequestContext(request)) 

ваш шаблон:

<form action="{{ action }}" method="post"> 
.... 
</form> 

В любом случае ваш question вид потребуется линия добавил, который на самом деле задает экземпляр продукта для Question атрибут:

def question(request, product_id): 
    ... 
    new_question.product = p 

+0

я имел product_id уже в URL, поэтому теперь я просто ставлю это следующим образом: 'new_question = f.save (commit = False)', а затем эту строку 'new_question.post = p', а затем' new_question.save() ', и это сработало как шарм! Спасибо. – ramono

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