Report (flag) / bookmark

I want to build a report (flag) / bookmark for my project.
I did it, but I don’t understand how to check report (flag) / bookmark exist for object (in my case, this is article) from user. Because I suppose that user can add only one report / bookmark for object.

models.py

class Article(models.Model):
    title = models.CharField(max_length=255, db_index=True)
    author = models.ForeignKey(
        "users.CustomUser", on_delete=models.SET_NULL, null=True, db_index=True
    )
   content = models.TextField()

class Report(models.Model):
    class StatusReport(models.TextChoices):
        Inworking = "In working", _("In working")
        Accept = "Accept", _("Accept")
        Rejeced = "Rejeced", _("Rejeced")

    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    name = models.CharField(max_length=250)
    body = models.TextField()
    date = models.DateTimeField(default=timezone.now, blank=True, null=True)
    url = models.URLField()
    status = models.CharField(
        max_length=255, choices=StatusReport.choices, default=StatusReport.Inworking
    )
    article = models.ForeignKey(
        Article, null=True, blank=True, on_delete=models.SET_NULL)
    response = models.TextField(blank=True, null=True)

class Bookmark(models.Model):
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
     date = models.DateTimeField(default=timezone.now, blank=True, null=True)
    article = models.ForeignKey(
        Article, null=True, blank=True, on_delete=models.SET_NULL)

views.py

# Report
class ReportCreateView(SuccessMessageMixin, LoginRequiredMixin, CreateView):
    model = Report
    form_class = ReportForm
    template_name = "articles/report_create.html"
    success_message = "%(name)s was created successfully"

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.url = self.request.get_full_path()
        return super().form_valid(form)
   
    def post(self, request, slug, *args, **kwargs):
        form = self.get_form()
        article = Article.objects.get(slug=slug)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.user = self.request.user
            obj.article = article
            obj.url = self.request.get_full_path()

# I try to build something like this but it isn't work
            if report.user.exists():
                raise ValidationError("You can't save more than two items")
            else:
                obj.save()
                form.save_m2m()
                return redirect("/")
        return self.render_to_response({"form": form})

# Bookmark has the same view

something like this?

try:
    Report.objects.get(
        user=self.request.user,
        article__id=ze_article_id
    )
except Report.DoesNotExist:
   # create the report here, since none could be found

or

if not Report.objects.filter(
    user=self.request.user,
    article__id=ze_article_id
).exists():
    # create the report here, since none could be found

or get_or_create?

1 Like

Thank you for response! It works good!