EilonA
EilonA

Reputation: 581

Django UpdateView has empty forms

I'm using UpdateView to edit data using forms.

After cliking the Edit button a modal is being popped up with a few forms that can be edited and then after I edit and click confirm I redirect to /edit/{PK}.

The problem is that the forms are blank! are totally new.. I want to have the previous data inside the forms already instead of blank.

view.py-

from django.shortcuts import render_to_response
from django.shortcuts import get_object_or_404
from django.shortcuts import render, redirect
from django.template import RequestContext
from django.views.generic import TemplateView, UpdateView, DeleteView, CreateView
from DevOpsWeb.forms import HomeForm
from DevOpsWeb.models import serverlist
from django.core.urlresolvers import reverse_lazy
from simple_search import search_filter
from django.db.models import Q


class HomeView(TemplateView):

    template_name = 'serverlist.html'


    def get(self, request):
        form = HomeForm()
        query = request.GET.get("q")
        posts = serverlist.objects.all()

        if query:
            posts = serverlist.objects.filter(Q(ServerName__icontains=query) | Q(Owner__icontains=query) | Q(Project__icontains=query) | Q(Description__icontains=query) | Q(IP__icontains=query) | Q(ILO__icontains=query) | Q(Rack__icontains=query))
        else:
            posts = serverlist.objects.all()
        args = {'form' : form, 'posts' : posts}
        return render(request, self.template_name, args)

    def post(self,request):
        form = HomeForm(request.POST)
        posts = serverlist.objects.all()



        if form.is_valid(): # Checks if validation of the forms passed
            post = form.save(commit=False)
            #if not form.cleaned_data['ServerName']:
            #post.servername = " "
            post.save()
            #text = form.cleaned_data['ServerName']
            form = HomeForm()
            return redirect('serverlist')
        args = {'form': form,  'text' : text}
        return render(request, self.template_name,args)


class PostDelete(DeleteView):
    model = serverlist
    success_url = reverse_lazy('serverlist')

class PostEdit(UpdateView):
    model = serverlist
    #post = serverlist.objetcs.get(server_id=server_id)
    fields = ['ServerName','Owner','Project','Description','IP','ILO','Rack','Status']
    success_url=reverse_lazy('serverlist')

urls.py -

from django.conf.urls import url, include
from DevOpsWeb.views import HomeView
from DevOpsWeb.views import PostDelete
from DevOpsWeb.views import PostEdit
from django.contrib import admin
admin.autodiscover()

urlpatterns = [
    # Examples:
    url(r'^$', HomeView.as_view(), name='serverlist'),

     url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
     #DevOpsWeb:8000/Delete/
     url(r'^delete/(?P<pk>\d+)/$', PostDelete.as_view(), name="delete_post"),
     url(r'^django_popup_view_field/', include('django_popup_view_field.urls', namespace="django_popup_view_field")),
     url(r'^admin/', include(admin.site.urls)),
     #DevOpsWeb:8000/edit/
     url(r'^edit/(?P<pk>\d+)/$', PostEdit.as_view(), name="edit_post"),
]

forms.py -

from django import forms
from DevOpsWeb.models import serverlist


class HomeForm(forms.ModelForm):
    ServerName = forms.CharField(widget=forms.TextInput,max_length = 30,required=False)
    Owner = forms.CharField(max_length = 50,required=False)
    Project = forms.CharField(max_length = 30,required=False)
    Description = forms.CharField(max_length = 255,required=False)
    IP = forms.CharField(max_length = 30,required=False)
    ILO = forms.CharField(max_length = 30,required=False)
    Rack = forms.CharField(max_length = 30,required=False)
    Status = forms.CharField(max_length = 30,required=False)
    class Meta:
        model = serverlist
        fields = ('ServerName' ,'Owner','Project','Description','IP','ILO','Rack','Status',)

class AutoCompleteModelChoiceField(forms.ModelChoiceField):
    widget = forms.TextInput
    def clean(self, value):
        value = super(AutoCompleteModelChoiceField, self).clean(value)
        return value


class serverForm(forms.ModelForm):
    hotel = AutoCompleteModelChoiceField(queryset=serverlist.objects.all())

index.html (The part with the edit button)-

            <div class="modal fade bd-example-modal-sm" id="Edit{{server.id}}" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
  <div class="modal-dialog modal-sm">
    <div class="modal-content">
                        <div class="modal-header">
                                <h5 class="modal-title">Edit Server <b>{{ server.ServerName }}</b> </h5>
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                        <span aria-hidden="true">&times;</span>
                                </button>
                        </div>
                                <div class="modal-body">
                                        <form action="{% url 'edit_post' server.id %}" method="post"> {% csrf_token %}
                                <!--<center>    {{ form.as_p }} </center> -->
                                                        {% for field in form %}
                                                                <div class="fieldWrapper">
                                                {{ field.errors }}
                                                                        <!-- {{ field.label_tag }} -->

                                <small><b>{{ field.html_name }}<p align="left"></b> {{ field }}</small> </p>

                                                {% if field.help_text %}
                                                <p class="help">{{ field.help_text|safe }}</p>
                                                {% endif %}

                                                        </div>


                                {% endfor %}
                </div>
                <div class="wrapper">
                &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                <h2><button type="submit" class="save btn btn-success btn-lg">Confirm</button></h2>&nbsp&nbsp&nbsp
                                <h2><button type="submit" class="btn btn-secondary btn-lg" data-dismiss="modal">Cancel</button></h2>
                </div>
                </form>
            </td>
                </div>
        </tr>
                {% endfor %}

Upvotes: 1

Views: 1377

Answers (1)

Ankita Gupta
Ankita Gupta

Reputation: 583

The problem with your code is that your success_url calls the HomeView and thus the get() method of HomeView is called. And in get() method you created again a new form object.You must initialise your form with the instance that you want to update:

form = HomeForm(instance = your_serverlist_object)

And as you have to call the same HomeView at the first time as well as after edit you can pass some query parameter to detect which kind of form object you need to send in context.Like: success_url="%s?edit=true" % reverse_lazy('serverlist')

Now in HomeView overriding dispatch method.

class HomeView(TemplateView):

    template_name = 'serverlist.html'
    def dispatch(self, request, *args, **kwargs)
        query = request.GET.get("q")

        if query:
            self.posts = serverlist.objects.filter(Q(ServerName__icontains=query) | Q(Owner__icontains=query) | Q(Project__icontains=query) | Q(Description__icontains=query) | Q(IP__icontains=query) | Q(ILO__icontains=query) | Q(Rack__icontains=query))
        else:
            self.posts = serverlist.objects.all()

    def get(self, request):
        if request.GET.get('edit', ''):
            form = HomeForm(instance = self.posts)
        else:
            form = HomeForm()
        args = {'form' : form, 'posts' : self.posts}
        return render(request, self.template_name, args)

Upvotes: 1

Related Questions