0

(ユーザーがドロップダウンで製品を指定するのではなく)製品を参照するURLを介して渡された引数に基づいて、フォームによって送信されたデータを保存できるようにしたいと思います。これをどのように達成できるかについて何か考えはありますか?

url(r'^products/(?P<product_id>\d+)/reviews/$', 'view_reviews'),
url(r'^products/(?P<product_id>\d+)/add_review/$', 'add_review'), 

def add_review(request, product_id):
    p = get_object_or_404(Productbackup, pk=product_id)
    if request.method == 'POST':
        form = ReviewbackupForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('reserve.views.view_reviews', kwargs={'product_id':p.id}))
    else:
        form = ReviewbackupForm()
    variables = RequestContext(request, {'form': form, 'product_id': product_id})
    return render_to_response('reserve/templates/create_review.html', variables)

RATING_OPTIONS = (
    (1, '1'),
    (2, '2'),
    (3, '3'),
    (4, '4'),
    (5, '5'),
    (6, '6'),
    (7, '7'),
    (8, '8'),
    (9, '9'),
    (10, '10'),
)
class Reviewbackup(models.Model):
    review = models.CharField('Review', max_length = 2000)
    date = models.DateField('date')
    created_on = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    user = models.CharField('Username', max_length =  200)
    rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS)
    product = models.ForeignKey(Productbackup)
    def __unicode__(self):
        return self.review

class ReviewbackupForm(ModelForm):
    class Meta:
        model = Reviewbackup
        fields = ('review', 'rating', 'user', 'date')
        widgets = {
            'review': Textarea(attrs={'cols': 80, 'rows': 7}),
        }

class Productbackup(models.Model):
    website = models.CharField('Product name', max_length = 200)
    website_url = models.URLField('Product URL')
    category = models.ForeignKey(Categories)
    created_on = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    def __unicode__(self):
        return self.website
4

1 に答える 1

4

を利用form.save(commit=False)し、インスタンスでモデルの他の属性を設定して、再度保存することができます。

ビューでフォームを保存すると、次のようになります。

if form.is_valid():
    review = form.save(commit=False)
    review.product = p
    review.save()
于 2012-07-03T12:17:15.203 に答える