Django - заполнение формы «обновление / редактирование» с помощью автоматического поля и внешнего ключа - PullRequest
1 голос
/ 23 октября 2010

Я новичок в Django и создаю приложение для создания и отображения данных о сотрудниках для моей компании. В настоящее время модель, форма нового сотрудника, отображение таблицы сотрудников, вход / выход из системы, все работает. Я работаю над редактированием текущих списков. У меня наведите курсор на ссылки на строки, чтобы передать pk (employeeid) по URL-адресу, и форма заполняется правильно, за исключением того, что многие поля не заполняются, а значение pk увеличивается, что приводит к дублированию записи (кроме любых изменений данных).

Я добавлю только пример кода, потому что модель / форма имеет 35 полей, что делает для очень длинного кода способ, которым я делал поля формы вручную (для получения более красивого формата).

#view.py  #SEE EDIT BELOW FOR CORRECT METHOD
@login_required
def employee_details(request, empid): #empid passed through URL/link
    obj_list = Employee.objects.all()
    e = Employee.objects.filter(pk=int(empid)).values()[0]
    form = EmployeeForm(e)
    context_instance=RequestContext(request) #I seem to always need this for {%extend "base.html" %} to work correctly
        return render_to_response('employee_create.html', locals(), context_instance,)

#URLconf 
    (r'^employee/(?P<empid>\d+)/$', employee_details),

# snippets of employee_create.html. The same template used for create and update/edit, may be a source of problems, they do have different views- just render to same template to stay DRY, but could add an additional layer of extend for differences needed between the new and edit requests EDIT: added a 3rd layer of templates to solve this "problem". not shown in code here- easy enough to add another child template
{% extends "base.html" %}
{% block title %}New Entry{% endblock %}
{% block content %}
<div id="employeeform">     
    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}
    <form action="/newemp/" method="post" class="employeeform">{% csrf_token %} #SEE EDIT
        <div class="left_field">
            {{ form.employeeid.value }}

            {{ form.currentemployee.errors }}
            <label for="currentemployee" >Current Employee?</label>
            {{ form.currentemployee }}<br/><br/>

            {{ form.employer.errors }}
            <label for="employer" class="fixedwidth">Employer:</label>
            {{ form.employer }}<br/>

            {{ form.last_name.errors }}
            <label for="last_name" class="fixedwidth">Last Name:</label>
            {{ form.last_name }}<br/>

                    {{ form.facility.errors }} #ManyToMany 
            <label for="facility" class="fixedwidth">Facility:</label>
            {{ form.facility }}<br/><br/>
                </div>
        <div id="submit"><br/>
        <input type="submit" value="Submit">
        </div>
    </form> 



#models.py
class Employee(models.Model):
    employeeid = models.AutoField(primary_key=True, verbose_name='Employee ID #')
        currentemployee = models.BooleanField(null=False, blank=True, verbose_name='Current Employee?') 
        employer = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
        facility = models.ForeignKey(Facility, null=True, blank=True)

base.html просто имеет заголовок вверху, меню слева и большой пустой элемент div, в который входят формы, таблицы сотрудников и т. Д.

screenshot2

Итак, как мне нужно изменить свое представление и / или шаблон в шаблоне, чтобы обновить запись, а не создавать новую? ( И как мне заполнить правильные иностранные ключи? (в раскрывающихся списках доступны нужные параметры, но «-----» выбрано, даже если исходная запись базы данных содержит правильную информацию.

Дайте мне знать, если мне нужно добавить еще файлы / код У меня тоже есть больше фото, но я не могу связать больше или вставить их как нового пользователя: <Я просто должен помочь и помочь другим людям! : D </p>

EDIT: Я работал над этим больше и не зашел слишком далеко. Я все еще не могу получить раскрывающиеся поля для выбора значений, сохраненных в базе данных (SQLite3). Но главная проблема, которую я пытаюсь выяснить, заключается в том, как сохранить как обновление, а не как новую запись. Функция сохранения (force_update = True) не работает со стандартными параметрами сохранения ModelForm.

Ответы [ 2 ]

4 голосов
/ 27 октября 2010
views.py
    def employee_details(request, empid):
        context_instance=RequestContext(request)
        obj_list = Employee.objects.all()

        if request.method == 'POST':
            e = Employee.objects.get(pk=int(empid))
            form = EmployeeForm(request.POST, instance=e)
            if form.is_valid():
                form.save() 
                return HttpResponseRedirect('/emp_submited/')
        else:
            e = Employee.objects.get(pk=int(empid))
            form = EmployeeForm(instance=e)
        return render_to_response('employee_details.html', {'form': form}, context_instance,)

также изменил действие формы шаблона на "" (из / newemp /, которое было правильным местоположением для моего нового сотрудника tempalte, но не для обновления.

Благодаря этот похожий вопрос .

0 голосов
/ 31 марта 2016

Обновление формы в djnago просто: шаги: 1. Извлеките предыдущие данные формы и заполните форму редактирования этими данными, чтобы показать их пользователю. 2. получить новые данные из формы редактирования и сохранить их в базе данных

step1: получение предыдущих данных

views.py

def edit_user_post(request, topic_id):
    if request.method == 'POST':
        form = UserPostForm(request.POST)
        if form.is_valid():
            #let user here be foreign key for the PostTopicModel
            user = User.objects.get(username = request.user.username)
            #now set the user for the form like: user = user

            #get the other form values and post them
            #eg:topic_heading = form.cleaned_data('topic_heading')
            #save the details into db
            #redirect
    else:
        #get the current post details
        post_details = UserPostModel.objcets.get(id = topic_id)
        data = {'topic_heading':topic.topic_heading,'topic_detail':topic.topic_detail,'topic_link':topic.topic_link,'tags':topic.tags}
        #populate the edit form with previous details:
        form = UserPostForm(initial = data)
    return render(request,'link_to_template',{'form':form})
...