Передать текущий product_id модели в Django - PullRequest
1 голос
/ 29 мая 2011

Я пытаюсь попробовать django, разрабатывая простую страницу, где люди могут спросить что-нибудь о продукте

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

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')
)

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

1 Ответ

3 голосов
/ 29 мая 2011

Вы можете либо:

Отправить product_id в качестве значения формы

Сделать product внешним ключом в вашей форме скрытое поле и установите его значение в значение первичного ключа продукта в представлении detail.Таким образом, вы не нуждаетесь в product_id в своем question URL-адресе просмотра и аргументах, поскольку идентификатор будет передан с данными POST.(см. ссылка для примеров)

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

или

Отправка product_id через URL

Использование reverse в вашем detail представлении для построенияатрибут формы action или используйте url тег шаблона , чтобы создать атрибут 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...