Django с использованием формы модели для обновления экземпляра модели - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующая модель в Django, которую я использую для хранения данных о лекарствах.

class Medicine(models.Model):
    Medicine_Name = models.CharField(max_length=100)
    User_Associated = models.ForeignKey(User, on_delete=models.CASCADE)
    Tablets_In_Box = models.IntegerField()
    Dose_in_mg = models.IntegerField()
    Dose_Tablets = models.IntegerField()
    Number_Of_Boxes = models.IntegerField()
    Last_Collected = models.DateField()

    def __str__(self):
        return self.Medicine_Name
    
    def get_absolute_url(self):
        return reverse('tracker-home')

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

class CollectionForm(forms.ModelForm):
    class Meta:
        model = Medicine
        fields = ['Medicine_Name', 'Number_Of_Boxes', 'Last_Collected']

Я не понимаю, как я могу вызвать экземпляр моей модели на основе 'Medicine_Name' из поля. Другими словами, мне нужно, чтобы пользователь мог выбрать правильное лекарство из раскрывающегося меню, а затем форма должна обновить поля Last_Collected и Numer_Of_Boxes в моей модели медицины.

https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the -save-method

Кажется, это содержит соответствующую информацию, но мне сложно понять, как ее использовать в этом случае. Как я могу правильно получить экземпляр нужной мне лекарственной формы на основе данных, введенных пользователем в форму? Кроме того, как я могу использовать метод сохранения в моих представлениях, чтобы убедиться, что база данных обновляется правильно?

EDIT Добавлено представление для формы:

def update(request, pk):
    
    instance = Medicine.objects.get(id=pk)
    if request.method == 'POST':
        form = CollectionForm(user=request.user, instance=instance, data=request.POST)
        
        if form.is_valid():
            instance = form.save(commit=False)
            instance.User_Associated = request.user
            instance.save()
    else:
        form = CollectionForm() 
    context = {'form': form}

    return render(request, 'tracker/medicine_collection.html', context )

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

** РЕДАКТИРОВАТЬ

просмотры:

def update(request, pk):
    instance = Medicine.objects.get(id=pk)

    if request.method == 'POST':
        form = CollectionForm(instance=instance, data=request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.User_Associated = request.user
            instance.save()
        return redirect ('/')
        ....

0 голосов
/ 09 августа 2020

Пробовал другой подход (представления на основе классов - UpdateView) Я только что узнал здесь, на SO. Не тестировал, но думаю, что это шаг в правильном направлении.

class UpdateMedicine(LoginRequiredMixin, UpdateView):
    model = Medicine  #call the model you need to update
    fields = ['Medicine_Name', 'Number_Of_Boxes', 'Last_Collected'] #specify the fields you need to update
    template_name_suffix = 'medicine_update_form' #specify the template where the update form is living

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update(
            user=self.request.user, #get the current logged in user
            instance=get_object_or_404(Medicine, pk=self.kwargs['pk']) #get the pk of the instance
        )
        return context

    def form_valid(self, form):
        form.instance.medicine = get_object_or_404(Medicine, slug=self.kwargs['pk'])
        return super().form_valid(form) #saves the updates to the instance 

    def get_success_url(self):
        return reverse('medicine-collection') #name of the url where your 'tracker/medicine_collection.html is living

Свяжите соответствующие шаблоны и URL-адреса с приведенным выше примером и попробуйте кое-что самостоятельно.

Ссылка на django документы:

https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/

Удачи!

0 голосов
/ 04 августа 2020

Это основано на обновлении экземпляра указанного c пользователя. Это руководство помогло мне добиться того же.

https://youtu.be/EX6Tt-ZW0so

...