Django克隆模型对象与基于类的createview

时间:2016-04-08 09:13:52

标签: django django-views clone

我想准备一个新对象但是等待用户输入来创建它:

我已将get_form添加到此视图中:

class MyCreateView(CreateView):

    def get_form(self, form_class):
        form = super(MyCreateManView, self).get_form(form_class)
        if self.kwargs['ref']:
            new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref'])
            new_item.pk = None 
            new_item.note = "Copia di " + new_item.note 
            form =  MyForm(instance = new_item)

    def form_valid(self, form):
        ...

在该方法中,我读取了GET参数'ref'并使用该数据预编译了表单字段。

但是当我提交数据时,不会执行form_valid方法,也不会创建新对象。

2 个答案:

答案 0 :(得分:2)

当你这样做时,

get_form_kwargs

您没有将表单绑定到任何数据。这意味着表单永远不会有效。

我会尝试覆盖def get_form_kwargs(self): kwargs = super(MyCreateView, self).get_form_kwargs() if self.kwargs['ref']: new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref']) ... kwargs['instance'] = new_item return kwargs

import java.util.Scanner;
public class Vecteur {
    public int n;
    static int i;
    static int j, k;
    int t[];
    static Scanner sc = new Scanner(System.in);
    Vecteur(int n) {
        this.n = n;
        t = new int[n];
    }
    Vecteur() {
        this.n = 0;
        t = null;
    }
    public void remplir() {
        this.t = new int[100]
            /*System.out.println("donner le nombre d'element a lire");
    n=sc.nextInt();*/
        for (i = 0; i < n; i++) {
            System.out.println("donner le " + i + "° element a lire");

            t[i] = sc.nextInt();
        }
    }
    public void contenu(Vecteur Tab) {
        i = 0;
        j = 0;
        if (n <= Tab.n) {
            while (j < Tab.n)

            {
                if (t[i] != Tab.t[j]) {
                    j++;
                    i = 0;
                } else {
                    i++;
                    j++;
                }

            }
            if (i > n) {
                System.out.println("Le tableau 1 est contenu dans tableau 2");
            } else {
                System.out.println("Le tableau 1 n'est pas contenu dans tableau 2");
            }
        } else {
            while (i < n)

            {
                if (t[i] != Tab.t[j]) {
                    i++;
                    j = 0;
                } else {
                    i++;
                    j++;
                }

            }
            if (j > n) {
                System.out.println("Le tableau 2 est contenu dans tableau 1");
            } else {
                System.out.println("Le tableau 2 n'est pas contenu dans tableau 1");
            }

        }
    }
    boolean appartient(int x) {
        i = 0;
        boolean trouve = false;
        while ((i < n) && (t[i] != x)) {
            i++;
        }
        if (i >= n)
            System.out.println("le x n'appartient pas a votre Tableau");
        else {
            System.out.println("le x appartient a votre tableau");
            trouve = true;
        }
        return trouve;
    }
    public void affiche() {
        for (i = 0; i < n; i++) {
            System.out.println(t[i]);
        }

    }
    public void trier() {
        int j, tmp;
        for (i = 0; i < n; i++) {

            for (j = i + 1; j < n; j++) {
                if (t[i] > t[j]) {
                    tmp = t[i];
                    t[i] = t[j];
                    t[j] = tmp;

                }

            }
        }

        for (int i = 0; i < n; i++) {

            System.out.println("Les élements de tableau aprés le trie sont  " + t[i]);

        }
    }

    void insere(int x) {
        if (appartient(x) == true) {
            System.out.println("L'insersion est impossible, La valeur existe deja!");

        } else {

            for (i = n;
                (i > 0) && (t[i - 1] > x); i--)
                t[i] = t[i - 1];
            /* VAL est copié à la position du dernier */
            /* élément déplacé. */
            t[i] = x;

            n++;


            for (i = 0; i < n; i++)
                System.out.println(t[i]);

        }
    }

    static void fusionner(Vecteur tab1, Vecteur tab2) {

        Vecteur FUS = new Vecteur(tab1.n + tab2.n);

        i = 0;
        j = 0;
        k = 0;
        while ((i < tab1.n) && (j < tab2.n))
            if (tab1.t[i] < tab2.t[j]) {
                FUS.t[k] = tab1.t[i];
                k++;
                i++;
            } else {
                FUS.t[k] = tab2.t[j];
                k++;
                j++;
            }

        while (i < tab1.n) {
            FUS.t[k] = tab1.t[i];
            k++;
            i++;
        }
        while (j < tab2.n) {
            FUS.t[k] = tab2.t[j];
            k++;
            j++;
        }

        /* Edition du résultat */
        System.out.println("Le tableau aprés le fusion est ");
        for (k = 0; k < tab1.n + tab2.n; k++)
            System.out.println(FUS.t[k]);

    }
    public static void main(String args[]) {

        System.out.println("donner le nombre d'element de la table 1");

        Vecteur tab1 = new Vecteur(100);

        tab1.n = sc.nextInt();

        tab1.remplir();
        tab1.affiche();
        tab1.trier();

        System.out.println("donner le nombre d'element de la table 2");

        Vecteur tab2 = new Vecteur(100);
        tab2.n = sc.nextInt();

        tab2.remplir();
        tab2.affiche();
        tab2.trier();

        fusionner(tab1, tab2);

        tab1.contenu(tab2);
        tab2.appartient(5);
        tab1.insere(6);
    }
}

答案 1 :(得分:1)

标记的答案是错误的,因为我已经对其进行了测试,它将覆盖您现有的对象!

改为在下面使用(在Django 2.17上测试)


    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()

        old_item = get_object_or_404(Tutorial, pk=self.kwargs['pk'])
        new_item = deepcopy(old_item)
        new_item.id = None
        kwargs['instance'] = deepcopy(new_item)

        return kwargs