Форма Django: как я могу получить второго пользователя с помощью экземпляра?

#django

#django

Вопрос:

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

Предположим, у меня есть частная группа с двумя пользователями (один — потребитель, другой — продавец), только потребитель может иметь доступ к этой форме.

Итак, form.instance.consumer = self.request.user работает хорошо.

form.instance.channel = self.object также работает хорошо.

В своих формах я использую хрустящие формы, и в них отображаются только два поля (оценить и прокомментировать).

Но мой вопрос в том, как я могу получить пользователя продавца?Я начинаю с Django 🙂

 #Channel REVIEW        
@method_decorator(login_required(login_url='/cooker/login'),name="dispatch")
class ChannelReview(generic.DetailView, FormMixin):
    model = Channel
    context_object_name = 'channel'
    template_name = 'channel_review.html'
    form_class = ChannelRatingForm
    
    def get_context_data(self, **kwargs):
        context = super(ChannelReview, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def form_valid(self, form):
        if form.is_valid():
            form.instance.channel = self.object
            form.instance.seller = seller #### Here is my question 
            form.instance.consumer = self.request.user
            form.save()
            return super(ChannelReview, self).form_valid(form)
        else:
            return super(ChannelReview, self).form_invalid(form)

    def post(self,request,*args,**kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_valid(form)

    def get_success_url(self):
        return reverse('channel:channel_detail',kwargs={"slug":self.object.slug})
    
    def get(self,request,*args,**kwargs):
        self.object = self.get_object()
        if not (request.user == self.object.consumer or request.user == self.object.seller):
            return HttpResponseRedirect('/') 
        
        return super(ChannelReview, self).get(request,*args,**kwargs)

class Channel(models.Model):
    consumer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="channel_consumer", blank=True, null=True)
    name = models.CharField(max_length=10)
    seller = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="channel_seller")

class Rating(models.Model):
    channel = models.OneToOneField(Channel,on_delete=models.CASCADE,related_name="rating_channel")
    consumer = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE,related_name='rating_consumer')
    seller = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE,related_name='rating_seller')
    is_rated = models.BooleanField('Already rated', default=True)
    comment = models.TextField(max_length=200)
    publishing_date = models.DateTimeField(auto_now_add=True)
    ratesugar = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)])

  
  

Ответ №1:

Вы можете использовать .update для обновления объекта модели, например, в этом случае.

https://www.kite.com/python/examples/5166/django-models-update-a-model-object-without-loading-the-object-from-the-database