Существует еще одна функция stacktrace, предлагаемая семейством Throwable - возможность управлять информацией о трассировке стека.
Стандартное поведение:
package test.stack.trace;
public class SomeClass {
public void methodA() {
methodB();
}
public void methodB() {
methodC();
}
public void methodC() {
throw new RuntimeException();
}
public static void main(String[] args) {
new SomeClass().methodA();
}
}
Трассировка стека:
Exception in thread "main" java.lang.RuntimeException
at test.stack.trace.SomeClass.methodC(SomeClass.java:18)
at test.stack.trace.SomeClass.methodB(SomeClass.java:13)
at test.stack.trace.SomeClass.methodA(SomeClass.java:9)
at test.stack.trace.SomeClass.main(SomeClass.java:27)
Манипулированная трассировка стека:
package test.stack.trace;
public class SomeClass {
...
public void methodC() {
RuntimeException e = new RuntimeException();
e.setStackTrace(new StackTraceElement[]{
new StackTraceElement("OtherClass", "methodX", "String.java", 99),
new StackTraceElement("OtherClass", "methodY", "String.java", 55)
});
throw e;
}
public static void main(String[] args) {
new SomeClass().methodA();
}
}
Трассировка стека:
Exception in thread "main" java.lang.RuntimeException
at OtherClass.methodX(String.java:99)
at OtherClass.methodY(String.java:55)
Прежде всего, вам следует немного изменить свой статус.
STATUSES = (
(0, 'unpaid'),
(1, 'paid')
)
class Post_Paid_Sell_Tut(models.Model):
paying_user = models.ForeignKey(User, on_delete=models.CASCADE)
post_sell_tut = models.ForeignKey(Post_Sell_Tut, on_delete=models.CASCADE)
STATUS = models.IntegerField(choices=STATUSES, default=0)
Это облегчит последующие поиски в базе данных и прояснит проблемы. Тогда, если вы просто обновляете статус, вам не нужна никакая форма.
def post_sell_tut_buy(request, pk):
post = get_object_or_404(Post_Sell_Tut, pk=pk)
if request.user == post.author:
messages.error(request, 'You cant buy your own Post!')
return redirect('post_sell_tut_detail', pk=pk)
else:
template = 'Post_Sell_Tut/post_sell_tut_buy.html'
post.STATUS = 1 # You are updating the STATUS
post.save() # you are writing the change to database
context = {
'post': post
}
return render(request, template, context)
Кроме того, передавая post
экземпляр в шаблон, вы хотите просмотреть информацию, вы должны следовать этому:
def post_sell_tut_buy(request, pk):
post = Post_Paid_Sell_Tut.objects.select_related('post_sell_tut').filter(pk=pk)
if request.user == post.author:
messages.error(request, 'You cant buy your own Post!')
return redirect('post_sell_tut_detail', pk=pk)
else:
template = 'Post_Sell_Tut/post_sell_tut_buy.html'
post.STATUS = 1 # You are updating the STATUS
post.save() # you are writing the change to database
context = {
'post': post
}
return render(request, template, context)
Я добавил select_related
, потому что, когда вы пытаетесь получить информацию по внешнему ключу из post это не вызовет дополнительный запрос к БД .
ОБНОВЛЕНИЕ
def post_sell_tut_buy(request, pk):
post = Post_Sell_Tut.objects.select_related('author).filter(pk=pk)
if request.user == post.author:
messages.error(request, 'You cannot buy POst(s) you created by your own!')
return redirect('post_sell_tut_detail', pk=post.pk)
else:
template = 'Post_Sell_Tut/post_sell_tut_buy.html'
context = {
'post': post,
}
return render(request, template, context)
Вы не можете получить доступ к STATUS
из модели Post_Sell_Tut
. У него нет этого поля.
def post_sell_tut_buy_exec(request, pk):
post_sell_tut = get_object_or_404(Post_Sell_Tut, pk=pk)
post_paid_sell_tut = Post_Paid_Sell_Tut.objects.filter(post_sell_tut=post_sell_tut)
if request.user == post.author:
messages.error(request, 'You cannot buy Post(s) you created by your own!')
return redirect('post_sell_tut_detail', pk=post.pk)
else:
template = 'Post_Sell_Tut/post_sell_tut_buy.html'
post_paid_sell_tut.STATUS = 1
post_paid_sell_tut.save()
context = {
'post': post
}
return render(request, template, context)
просто создайте объект «Post_Paid_Sell_Tut», когда пользователь просит купить пост
def post_sell_tut_buy(request, pk):
post = get_object_or_404(Post_Sell_Tut, pk=pk)
if request.user == post.author:
messages.error(request, 'You cant buy your own Post!')
return redirect('post_sell_tut_detail', pk=post.pk)
else:
try:
# throws an exception if not bought yet
Post_Paid_Sell_Tut.get(paying_user=request.user, post_sell_tut=post)
messages.success(request, 'you allready have this post!')
# ... other stuff
except Post_Paid_Sell_Tut.DoesNotExist:
# create Post_Paid_Sell_Tut object indicating that the user bought the post
ppst = Post_Paid_Sell_Tut(paying_user=request.user,
post_sell_tut=post, status="paid")
ppst.save()
messages.success(request, 'post is yours :)!')
# ... other stuff