GTA.sprx
GTA.sprx

Reputation: 827

Edit existing instance of a model

I have created a form to create an instance of my car dealer model. Now I want to be able to click on an edit icon and be taken to a page with a form that is prepopulated with the attributes of the model instance.

I'm also wondering if I need to create a separate form, view and template for creating and editing or perhaps I can reuse them somehow?

models.py

class Dealer(models.Model):
    name = models.CharField(max_length=50)
    phone = models.CharField(max_length=50)
    website = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    featured_image = models.ImageField(upload_to="dealers/")

    def image_tag(self):
        return mark_safe('<img src="%s" style="height: 300px; width: auto;"/>' % (self.featured_image.url))

    image_tag.short_description = 'Image'

    class Meta:
        verbose_name_plural = "Dealers"

    def __str__(self):
        return self.name

views.py

def create_dealer_view(request):
    if request.method == "POST":
        form = CreateDealerForm(request.POST, request.FILES)
        if form.is_valid():
            dealer = form.save(commit=False)
            dealer.save()
            return redirect('main:homepage_view')
    else:
        form = CreateDealerForm
    context = {
        "title": "Create - Dealer",
        "form": form,
    }
    return render(request=request, template_name="main/create/create_dealer.html", context=context)

forms.py

class CreateDealerForm(forms.ModelForm):
    class Meta:
        model = Dealer
        fields = ('name', 'phone','website', 'address', 'featured_image',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'dealer-name-field', 'placeholder': 'Dealer name'}),
            'phone': forms.TextInput(attrs={'class': 'dealer-phone-field', 'placeholder': 'Dealer phone'}),
            'website': forms.TextInput(attrs={'class': 'dealer-website-field', 'placeholder': 'Dealer website'}),
            'address': forms.TextInput(attrs={'class': 'dealer-address-field', 'placeholder': 'Dealer address'}),
        }

Upvotes: 0

Views: 382

Answers (1)

bmons
bmons

Reputation: 3392

You just have to write an update view and its url only, can use the same form and template

def update_dealer_view(request, pk=none):
    instance = get_object_or_404(Dealer, pk=pk)
    form = CreateDealerForm(request.POST, request.FILES, , instance=instance)
    if form.is_valid():
        dealer = form.save(commit=False)
        dealer.save()
        return redirect('main:homepage_view')

    context = {
        "title": "Update - Dealer",
        "form": form,
        "instance=instance"
    }
    return render(request=request, template_name="main/create/create_dealer.html", context=context)

and make a url for this view

 path('dealer/update/<int:pk>/', update_dealer_view, name='update_dealer),

Upvotes: 3

Related Questions