如何在报表/标志用户对象UR的CreateView中获取页面的URL



我正在尝试创建一个将在我的所有模板上使用的报告模型。其想法是,成员将能够报告其他成员的未经授权的内容。主持人将知道页面的URL和该模板上用户的用户名报告了什么。我不知道如何获得点击报告按钮的URL。一旦创建了报告对象,我也很难将用户返回到同一页面

以下是报表模型的模型。py

class Report(models.Model):
reporter = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='reporting_members')
reported = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='reported_members')
report_url = models.URLField(max_length=2000, blank=True, null=True)
reported_at = models.DateTimeField(auto_now_add=True)
reporting_choices = (
('1', 'The images posted by this user are not relevant to the Post),
('2', 'Rude or abusive content, The words chosen by the user are inappropriate'),
('3', 'This user is asking me to change my review in return for favor '),
('4', 'Other'),
)
reason_to_report = models.CharField(max_length=1, choices=reporting_choices)
explain_reason = models.TextField(blank=True, null=True)

以下是我的视图。py

class ReportCreateView(LoginRequiredMixin, CreateView):
model = Report
fields = ('reason_to_report', 'explain_reason')
def form_valid(self, form):
form.instance.reporter = self.request.user  #This works
form.instance.reported = User.objects.get(username=self.kwargs.get('username')) #This works
form.instance.report_url = self.kwargs.get()#I am not sure how to get this URL  
super().form_valid(form)
return redirect(self.request.META['HTTP_REFERER']) #This line is not working not sure how to get the user back to the same page

但是,如果我让报告成员在该字段中复制粘贴URL,而不是尝试使用代码进入。对象已创建。但我需要URL自动获得

以下是该应用程序的URLS.py。它只有1个url

app_name = 'report'
urlpatterns = [
url(r'^(?P<username>[-w]+)/$', views.ReportCreateView.as_view(), name='report_user'),
]

要报告的URL看起来像这个

http://127.0.0.1:8000/posts/Amanda/7/  (This is Amanda's Post)          
http://127.0.0.1:8000/posts/George/9/ (This is George's Post Amanda has a comment on this Post)

按钮的hrefs根据放置标志按钮的对象而变化。下面是两个不同的地方,标志按钮被放置在

<a href="{% url 'report:report_user' username=post.user.username %}"> #If the flag is on the post
<a href="{% url 'report:report_user' username=post.comment.author.username %}"> #If the flag is on the comment
# views.py
def form_valid(self, form):
...
form.instance.report_url = self.request.path
# models.py
from django.urls import reverse
class Report(models.Model):
...
...
def get_absolute_url(self):
return reverse('report_user', kwargs={'username': self.reported})

由于这个问题和@Mint引导我朝着正确的方向,我终于能够弄清楚对表单模板进行了更改

<form action="" method="post" >
{% csrf_token %}
{% bootstrap_form form %}
<input type="hidden" name="next" value="{{ request.META.HTTP_REFERER }}">#This is where the magic happens. This gets the URL before the form page
<input class="btn btn-primary" type="submit" />            
</form>

以下是视图.py

class ReportCreateView(LoginRequiredMixin, CreateView):
model = Report
fields = ('reason_to_report', 'reason')
def form_valid(self, form):
form.instance.reporter = self.request.user
form.instance.reported = User.objects.get(username=self.kwargs.get('username'))
next = self.request.POST.get('next') #This keeps the post URL in memory
form.instance.report_url = next
super().form_valid(form)
return redirect(form.instance.report_url)

最新更新